こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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のような小さいサイズにしてしまったときだけスクロールバーが現れるようにできたらもっと嬉しいです。
 回答宜しくお願いします。

投稿日時 - 2010-02-22 01:19:17

QNo.5696260

すぐに回答ほしいです

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

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でのやり方。

投稿日時 - 2010-02-22 23:14:34

お礼

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

投稿日時 - 2010-02-23 01:08:14

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

}

投稿日時 - 2010-02-22 14:22:05

お礼

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

投稿日時 - 2010-02-23 01:03:56

あなたにオススメの質問