3

プログラムのアイデアは、フレームのどこかにいくつかのボタンとアイコンがあるということです。ボタンの色を変えたい。私は今、すべての要素を表示することだけを心配しています。11 行目から 13 行目をコメント アウトすると、"hello" が印刷され、その上に赤い丸が表示されます。それ以外の場合は、「こんにちは」または赤い円のないボタン「赤」だけがあります。だからここに私のコードがあります:

import javax.swing.*; 
import java.awt.*;
import java.awt.geom.*;

public class ButtonTester 

{
    public static void main (String[] args) 
    {  
        JFrame frame = new ButtonFrame(); 
        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
        JButton redButton = new JButton("Red");
        frame.add(redButton);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true); 
    }
}

class ButtonFrame extends JFrame 
{  
    public static final int DEFAULT_WIDTH = 300;  
    public static final int DEFAULT_HEIGHT = 200;  

    public ButtonFrame() 
    {   
        setTitle("Hello"); 
       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
       ButtonPanel panel = new ButtonPanel(); 
       add(panel); 
    } 
} 

class ButtonPanel extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    {   
        super.paintComponent(g); 
        Graphics2D g2 = (Graphics2D) g;  
        g2.drawString("Hello !", 100, 100);
        Icon ico = new ColorIcon(32);
        ico.paintIcon(null, g, 75, 75);
    } 
} 

問題は 11 ~ 13 行目であると 90% 確信していますが、すべてを表示するには何を変更すればよいかわかりません。

4

1 に答える 1

4

あなたの問題は、ButtonPanel のサイズが 0 であることです。 getPreferredSize() をオーバーライドすると、私の意味がわかります。

class ButtonPanel extends JPanel {
   private static final int PREF_W = 150;
   private static final int PREF_H = PREF_W;

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.drawString("Hello !", 100, 100);
      // !! Icon ico = new ColorIcon(32);
      // Icon ico = new ImageIcon();
      // ico.paintIcon(null, g, 75, 75);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}

また、関係のないことですが、paintComponent メソッド内で Icon を作成するのはなぜですか? これは私には意味がなく、グラフィックを不必要に遅くするだけです。

あなたの状態を編集
:

わかりました、 getPreferredSize() をオーバーライドした後に違いがわかりますが、アイコンを作成する「より良い」または「正しい」方法は何でしょうか? Java の教科書にある演習の指示に従おうとしているところです:演習 4.14。「赤」、「緑」、「青」のラベルが付いた 3 つのボタンと、最初は赤の円を示すアイコンを含むラベルを含むフレームを表示するプログラムを作成します。ユーザーがボタンをクリックすると、円の塗りつぶしの色が変わるはずです。色を変更するときは、ラベルの repaint メソッドを呼び出す必要があります。repaint の呼び出しにより、paintIcon メソッドが呼び出され、アイコンを新しい色で再描画できるようになります。

これについては別の方法で考える必要があります。私自身は、青い円、赤、緑の 3 つの ImageIcons を作成します。次に、JFrame の JLabel に ImageIcon を表示します。メソッドを使用してラベルのアイコンを交換するだけで、色を変更できますsetIcon(...)。私は混乱することを心配しませんpaintComponent(...)が、できるだけ単純な方法でこれを解決しようとします.

于 2013-03-03T00:38:50.237 に答える