Swingで図形描画:スクロールバーを表示する方法

このQ&Aのポイント
  • SwingのJFrameを使用して図形を描画する際に、画面から図形がはみ出してしまう場合は、スクロールバーを表示することができます。
  • 具体的な方法としては、JScrollPaneを使用して描画領域を包み込むことで、スクロールバーを自動的に表示させることができます。
  • また、ウインドウサイズが小さい場合のみスクロールバーを表示させるには、ウインドウサイズの判定と条件分岐を行い、必要な場合にのみスクロールバーを表示するようにコーディングします。
回答を見る
  • ベストアンサー

Swingについての質問です

Swingについての質問です  まだJava初心者です^^。とんでもない質問でしたらすいません。  Swingの中の、JFrameを使って、ある図形を描画するという場面です。描画はできたのですが、コンピュータの画面から図形がはみ出してしまって、全体を見る事ができません。そこで、スクロールバーを表示したいと思っているのですが、その方法はどうすれば良いのでしょうか?  下に、普段私が使っている、一本の線を描画するサンプルを書いておきます。 import java.awt.*; import javax.swing.*; public class Sample extend JPanel { public static void main(String[] args){ JFrame frame = new JFrame("Sample"); TestFrame tf = new TestFrame(); frame.add(tf); frame.getComponents().add(tf); frame.setSize(120, 120); //ウインドウサイズを120×120に指定 frame.setBackground(Color.WHITE); frame.setVisible(true); } } class TestFrame extends JPanel{ void paintComponent(Graphics g){ g.drawLine(10, 10, 100, 100); //(10, 10)から(100, 100)に線を描画 } }  もちろんこの場合はスクロールバーは必要ないですが、このような場合でもウインドウサイズを50×50のような小さいサイズにしてしまったときだけスクロールバーが現れるようにできたらもっと嬉しいです。  回答宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.2

import java.awt.*; import javax.swing.*; public class Sample { public static void main(String[] args) { JFrame frame = new JFrame("Sample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // サンプルとしては不要かもしれないが閉じた時に終了するように TestFrame tf = new TestFrame(); tf.setPreferredSize(new Dimension(200, 200)); // tfの推奨サイズを(200, 200)に設定する // frame.add(tf); // 直接tfをaddする代わりに frame.add(new JScrollPane(tf)); // JScrollPaneにtfを入れてJScrollPaneをaddする frame.setSize(120, 120); //ウインドウサイズを120×120に指定 // frame.setBackground(Color.WHITE); // 表示されるべき背景を白くするという意味ではこれは無意味 tf.setBackground(Color.WHITE); // デフォルトのレイアウトではJScrollPaneがコンテントペイン全体を覆い、 // tfがJScrollPane全体に引き伸ばされて表示されるのでtfの背景を白くする frame.setVisible(true); } } class TestFrame extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); // JPanelのpaintComponentを呼び出すことで設定された背景色でまず塗り潰す g.drawLine(10, 10, 100, 100); //(10, 10)から(100, 100)に線を描画 } }  要点はJScrollPaneに入れるものに推奨サイズを設定すること。デフォルトでJScrollPaneは自分の表示サイズと中身の推奨サイズとを比較して、中身が全部表示できないと判断すればスクロールバーを表示するようになっている。デフォルト動作以外が必要な時はJava API文書のJScrollPaneやScrollableの項目を参照。  上ではmainスレッドでGUI構築を行っているが、SwingUtilities#invokeLater等を使いEDTで行うのが本来のSwingでのやり方。

hira_kazu
質問者

お礼

 ありがとうございます^^  実際にやってみると成功しました。  早速使ってみようと思います^^

その他の回答 (1)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

netbeansを使うと簡単なのですが、 jframeにスクロールぺインを貼り付けてそこに Jpanelを貼り付けます。 Jpanelにlabelを貼り付けて、imageiconの画像を labelにセットします。 その例です。 大きな画像を貼り付けて、スクロールバーで、画像が、調整できます。 その例です。 public class goo2 extends javax.swing.JFrame { /** Creates new form goo2 */ public goo2() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(null); jLabel1.setIcon(new javax.swing.ImageIcon("C:画像 030.jpg")); // NOI18N jLabel1.setText("jLabel1"); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(22, 22, 22) .addComponent(jLabel1) .addContainerGap(270, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(20, 20, 20) .addComponent(jLabel1) .addContainerGap(165, Short.MAX_VALUE)) ); jScrollPane1.setViewportView(jPanel1); getContentPane().add(jScrollPane1); jScrollPane1.setBounds(30, 40, 330, 200); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-408)/2, (screenSize.height-334)/2, 408, 334); }// </editor-fold> /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new goo2().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration }

hira_kazu
質問者

お礼

 ありがとうございました^^  私もNetBeans使ってます。  この方法で試してみます。

関連するQ&A

  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • スクロールバー

    Javaを始めたばかりの者です。 すごく基本的な質問をさせて頂きます。 恥ずかしいのですが、スクロールバーを付けようとしても付けることができませんでした。 以下がそのプログラムですが、どうすればよいか正直わかりません。よければ教えて下さい。 import java.awt.*; import javax.swing.*; public class ScrolTest { public JPanel panel =new JPanel(); public static void main (String[] argv) { JFrame frame =new JFrame("てすとー"); frame.setSize(50000,6000); Scrollbar scrollbar = new Scrollbar(); frame.add(scrollbar, null); scrollbar.setBounds(new Rectangle(220, 15, 15, 180)); frame.show(); } }

  • Swing自作コンポーネントをadd出来るように、

    JTextFieldやJButtonなどを一つにまとめたコンポーネントを自作し、それをadd()出来るようにしたいです。frame.add(自作のクラスのインスタンス)を可能にしたいです。 調べて、paintComponent()を使えば良いということはわかったのですが、Graphicsのインスタンス(?)に線を描いたり、円を描いたりする方法はわかりましたが、JButtonやJTextFieldなどをGraphicsのインスタンス(?)に追加する方法はわからず、paintComponent()を使うやり方はできませんでした。 paintComponent()も使わずに、自分のできる方法で、組んだものを一応載せます。 import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class MyComponentTest{ public static void main(String[] args){ JFrame frame = new JFrame("タイトル"); frame.setSize(400, 300); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // 2つのテキストフィールドと一つのボタンを4つ追加する frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.setVisible(true); } } //2つのテキストフィールドと一つのボタンを一つの部品にしたい class TwoTextFieldsAndOneButton{ JTextField textField1 = new JTextField("テキストフィールド1"); JTextField textField2 = new JTextField("テキストフィールド2"); JButton button = new JButton("ボタン"); // こんなメソッドを使わずに、再現したい JPanel getContent(){ JPanel panel = new JPanel(); panel.add(textField1); panel.add(textField2); panel.add(button); return panel; } }

    • ベストアンサー
    • Java
  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • JAVA+SWING+WEBカメラを使用して、WEBカメラの動画を表示

    JAVA+SWING+WEBカメラを使用して、WEBカメラの動画を表示させるGUIアプリーションを開発しています。 JFrame上に「player.getVisualComponent()」をaddするとフレーム全体に画像が表示されますが、以下のソースコードの様に「player.getVisualComponent()」をJPanel上にaddするとPanelのサイズ一杯に動画が表示されるのではなく、WEBカメラのデフォルトサイズで必ず表示されてしまいます。 JPanel上で任意の大きさでWEBカメラからの動画を表示させることは可能なのでしょうか? ちなみにWEBカメラの動画表示アプリのソースコードは以下の通りです。 import javax.media.*; import javax.swing.*; public class ImageView { public static void main(String args[]) throws Exception { JFrame frame = new JFrame("ImageView"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Player player = Manager.createRealizedPlayer(new MediaLocator("vfw://0")); JPanel panel = new JPanel(); panel.add(player.getVisualComponent()); frame.setBounds(100, 100, 640, 480); frame.getContentPane().add(panel); frame.setVisible(true); player.start(); } } 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

    • ベストアンサー
    • Java
  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • JComboとJCheckとJPanelについて

    勉強しているのですが、書き方が全くわからないので、質問します。 この3つを使って図のようなプログラムをつくりたいのですが、どのように書いたらいいのでしょうか? ご教授お願いいたします。 中身をどのように書いたらいいのかまったくわからないんです・・・。 import java.awt.*; import javax.swing.*; public class HaitiRensyu extends JPanel{ public HaitiRensyu(){ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); addCheckBox(); addComboBox(); addButtons(); } private void addCheckBox(){ JPanel cboxPanel = new JPanel(); add(cboxPanel); } private void addButtons() { JPanel btnPanel = new JPanel(); add(btnPanel); } private void addComboBox() { JPanel comboPanel = new JPanel(); add(comboPanel); } public static void main(String[] args){ JFrame frame = new JFrame("JPanel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); HaitiRensyu h = new HaitiRensyu(); frame.add(h, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }

  • SwingでgetContentPaneのエラーです、お願いします

     今晩は、java勉強中のものです、宜しくお願いします。  下のようなプログラムを組んでみましたが、「型JFrameから非staticメソッドgetContentPane()にstatic参照 することは出来ません」というエラーコードです。  原因が良く分かりません、どなたか教えて下さい。  いくら考えても原因がよく分かりません、宜しくお願いします。 ================================================================ public class Panel_train extends JFrame{ public static void main(String[] args) { Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); JFrame frame = new JFrame("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaのフレームにサイズがセットされてない?

    前回、http://okwave.jp/qa/q8069621.htmlで質問しました。 回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。 しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、 サイズがセットされないまま実行したときと同じようになってしまいます。 なぜでしょう?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[] args) { Frame0 test=new Frame0(); test.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java

専門家に質問してみよう