0

ボタンをクリックしたときに、インターフェイスでカスタマイズされたボタンを動的に生成しようとしています。このような答えをいくつか検索しましたが、どういうわけかうまくいきません。以下の私の現在のコードに間違いはありますか?

  public class MainWindow {

private JFrame frame;
private JPanel panel;
private JPanel panel_1;
private JPanel panel_2;
private JSplitPane splitPane;
private JButton btnSearch;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainWindow window = new MainWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public MainWindow() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 645, 438);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

    splitPane = new JSplitPane();
    panel.add(splitPane);

    panel_1 = new JPanel();
    splitPane.setLeftComponent(panel_1);

    btnSearch = new JButton("Search");

    GridBagConstraints gbc_btnSearch = new GridBagConstraints();
    gbc_btnSearch.gridx = 0;
    gbc_btnSearch.gridy = 10;
    panel_1.add(btnSearch, gbc_btnSearch);

    panel_2 = new JPanel();
    splitPane.setRightComponent(panel_2);

    btnSearch.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            addButton();
        }
    });
}
protected void addButton() {
    MyButton hahaButton = new MyButton("haha");
    panel_2.add(hahaButton);
    panel_2.add(new JButton());
    panel_2.revalidate();
    panel_2.repaint();
}

そしてこれがMyButtonの定義です:

    public class MyButton extends JButton {

private static final long serialVersionUID = 1L;

private Color circleColor = Color.BLACK;

public MyButton(String label) {
    super(label);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Dimension originalSize = super.getPreferredSize();
    int gap = (int) (originalSize.height * 0.2);
    int x = originalSize.width + gap;
    int y = gap;
    int diameter = originalSize.height - (gap * 2);

    g.setColor(circleColor);
    g.fillOval(x, y, diameter, diameter);
}

@Override
public Dimension getPreferredSize() {
    Dimension size = super.getPreferredSize();
    size.width += size.height;
    return size;
}

}

4

2 に答える 2

1

ソースコードを試したところ、期待どおりに機能しました。分割ペインの左側にある検索ボタンをクリックするたびに、パネルの右側にあるパネルに2つのボタンが追加されます(1つは黒く塗りつぶされた円で、ラベルのないボタン)。

何がうまくいかないのですか?MacOSXでjava1.6を使用していますが、これは他のプラットフォームの以前のバージョンでも機能するはずです......

于 2012-04-04T19:43:46.470 に答える
1

Dieter Rehbeinが指摘したように、あなたが持っているコードはコンパイルして実行します。

ただし、さまざまなソースを一緒にコピーして貼り付けたかのように、かなりずさんで複雑でした。

私は数分かかり、それをいくつかクリーンアップしました、それが役立つことを願っています。

    パブリッククラスMainWindow
    {{
        public static void main(String [] args)
        {{
            new MainWindow();
        }

        public MainWindow()
        {{
            //分割ペインを作成します
            JSplitPane jSplitPane = new JSplitPane();

            最終的なJPanelleftPanel= new JPanel();
            最終的なJPanelrightPanel= new JPanel();

            jSplitPane.setLeftComponent(leftPanel);
            jSplitPane.setRightComponent(rightPanel);

            //ボタンを作成します
            JButton jButton = new JButton( "Generate");
            leftPanel.add(jButton);

            jButton.addMouseListener(new MouseAdapter()
            {{
                @オーバーライド
                public void mouseClicked(MouseEvent e)
                {{
                    addButtons(rightPanel);
                }
            });

            //パネルを作成します
            JPanel jPanel = new JPanel();

            jPanel.setLayout(new BoxLayout(jPanel、BoxLayout.X_AXIS));
            jPanel.add(jSplitPane);

            //フレームを作成します
            JFrame jFrame = new JFrame();

            jFrame.setBounds(100、100、645、438);
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.getContentPane()。add(jPanel、BorderLayout.CENTER);

            //フレームを表示します
            jFrame.setVisible(true);
        }

        private void addButtons(JPanel jPanel)
        {{
            addButton(jPanel、 "デフォルト"、null);
            addButton(jPanel、 "Red"、Color.RED);
            addButton(jPanel、 "Yellow"、Color.YELLOW);
            addButton(jPanel、 "Blue"、Color.BLUE);
            addButton(jPanel、 "Green"、Color.GREEN);
        }

        protected void addButton(JPanel jPanel、String label、Color color)
        {{
            jPanel.add(new MyButton(label、color));
            jPanel.revalidate();
            jPanel.repaint();
        }

        パブリッククラスMyButtonはJButtonを拡張します
        {{
            private static final long serialVersionUID = 1L;

            プライベートカラーcolor=null;

            public MyButton(String label、Color color)
            {{
                スーパー(ラベル);
                this.color = color;
            }

            @オーバーライド
            保護されたvoidpaintComponent(グラフィックグラフィックス)
            {{
                super.paintComponent(グラフィックス);

                if(color!= null)
                {{
                    ディメンションdimension=super.getPreferredSize();

                    intギャップ=(int)(dimension.height * 0.2);
                    int直径=dimension.height-(ギャップ* 2);

                    graphics.setColor(color);
                    graphics.fillOval(dimension.width + gap、gap、diameter、diameter);
                }
            }

            @オーバーライド
            public Dimension getPreferredSize()
            {{
                ディメンションサイズ=super.getPreferredSize();
                size.width + = size.height;
                リターンサイズ;
            }
        }
    }

于 2012-04-04T20:25:20.697 に答える