• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Swingについての質問です)

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

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

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

  • ベストアンサー
  • 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