3

私はJavaが初めてで、プログラムを実行するすべてのコンピューターでこの小さな問題を経験しました。私のコードは

    import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class FrameTest2 {


    public static void main(String[] args){
    String s = "Catch Torchic";

    MainMenu m = new MainMenu(s);
    }
}

class MainMenu extends JFrame {

    JButton autoa, manualb, createc, exitd;

    public MainMenu(String s){
        super(s);
        setBackground(new Color(247,247,111));
        setSize(640,600);
        setVisible(true);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
        CustomPanel panel = new CustomPanel();
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.setMinimumSize(new Dimension(600,365));
        panel.setPreferredSize(new Dimension(600,365));
        panel.setMaximumSize(new Dimension(600,365));
        panel.setBackground(new Color(247,247,111));
        contentPane.add(panel);
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout( new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
        btnPanel.setBackground(new Color(247,247,111));
        autoa = new JButton("AutoPlay");
        autoa.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(autoa);

        manualb = new JButton("Manual Play");
        manualb.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(manualb);

        createc = new JButton("Create Maze");
        createc.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(createc);

        exitd = new JButton("Exit");
        exitd.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(exitd);

        btnPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        contentPane.add(btnPanel);
        setContentPane(contentPane);

        ButtonHandler handler = new ButtonHandler(this);
        autoa.addActionListener(handler);
        manualb.addActionListener(handler);
        createc.addActionListener(handler);
        exitd.addActionListener(handler);
}

}

class ButtonHandler implements ActionListener{
    MainMenu mm;

    public ButtonHandler(MainMenu mm){
        this.mm = mm;
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == mm.autoa)
        System.out.println("Clicked on Auto");
        else if(e.getSource() == mm.manualb)
        System.out.println("Clicked on Manual");
        else if(e.getSource() == mm.createc)
        System.out.println("Clicked on Create");
        else 
        System.exit(0);
    }

}

class CustomPanel extends JPanel{
    public void paintComponent (Graphics painter){

    Image pic = Toolkit.getDefaultToolkit().getImage("logo.png");
    if(pic != null) painter.drawImage(pic, 105, 30, this); 

    }
}

このコードは次のようになります

左上隅に常に余分なボタンがあります。私の質問は、これを削除するにはどうすればよいですか? ボタンはランダムな間隔で表示されますが、表示されない場合もあります。

4

2 に答える 2

2

このバリアントを試してください。多くのコメント、SHOUTING で最も重要です。動作するコード(または、画像をロードするためにここで動作するコード)になるまでに、あなたが説明した問題を一度も見たことがないことに注意してください。

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.net.URL;
import javax.imageio.ImageIO;

public class FrameTest2 {

    public static void main(String[] args) throws Exception {
        final String s = "Catch Torchic";
        URL url = new URL("http://pscode.org/media/stromlo2.jpg");
        final Image image = ImageIO.read(url);

        //Create the frame on the event dispatching thread
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                new MainMenu(s, image);
            }

        });
    }
}

class MainMenu extends JFrame {

    JButton autoa, manualb, createc, exitd;

    public MainMenu(String s, Image image) {
        super(s);
        // do this after pack (if at all)
        //setSize(640,600);
        // do this after pack/setSize
        //setVisible(true);
        // don't do this in broken code
        //setResizable(false);
        // If you're going to spend space on GUI position..
        // setLocationRelativeTo(null);
        // ..do it like this.
        setLocationByPlatform(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        CustomPanel panel = new CustomPanel(image);
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        //panel.setMinimumSize(new Dimension(600,365));
        //panel.setPreferredSize(new Dimension(600,365));
        //panel.setMaximumSize(new Dimension(600,365));
        contentPane.add(panel);
        JPanel btnPanel = new JPanel();
        btnPanel.setBorder(new EmptyBorder(5,5,100,5));
        btnPanel.setLayout( new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
        // not needed for an SSCCE
        //btnPanel.setBackground(new Color(247,247,111));
        autoa = new JButton("AutoPlay");
        autoa.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(autoa);

        manualb = new JButton("Manual Play");
        manualb.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(manualb);

        createc = new JButton("Create Maze");
        createc.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(createc);

        exitd = new JButton("Exit");
        exitd.setAlignmentX(Component.CENTER_ALIGNMENT);
        btnPanel.add(exitd);

        // you already said that
        //btnPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        contentPane.add(btnPanel, BorderLayout.SOUTH);
        setContentPane(contentPane);

        ButtonHandler handler = new ButtonHandler(this);
        autoa.addActionListener(handler);
        manualb.addActionListener(handler);
        createc.addActionListener(handler);
        exitd.addActionListener(handler);

        // CAUSE THE COMPONENTS TO BE PROPERLY LAID OUT.
        pack();
        setSize(640,600);
        setVisible(true);
    }

}

class ButtonHandler implements ActionListener{
    MainMenu mm;

    public ButtonHandler(MainMenu mm){
        this.mm = mm;
    }

    public void actionPerformed(ActionEvent e){
        // for clarity, even single line statements 
        // in these should be enclosed in {}
        if(e.getSource() == mm.autoa)
            System.out.println("Clicked on Auto");
        else if(e.getSource() == mm.manualb)
            System.out.println("Clicked on Manual");
        else if(e.getSource() == mm.createc)
            System.out.println("Clicked on Create");
        else
            System.exit(0);
    }

}

class CustomPanel extends JPanel{

    Image pic;

    CustomPanel(Image pic) {
        this.pic = pic;
    }

    public void paintComponent (Graphics painter){
        // DO NOT TRY TO READ IMAGES IN PAINT!
        //Image pic = Toolkit.getDefaultToolkit().getImage("logo.png");
        if(pic != null) painter.drawImage(pic, 105, 30, this);
    }
}
于 2012-04-07T07:04:17.030 に答える
1

私はそれが欠けていると思いますcontentPane.:

    //setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
    contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));//

また、コンテンツ ペインの余分な設定があります。

    //setContentPane(contentPane);

「いいえ」の後:

難しい。 最後に移動setVisible(true)して、1 つのレイアウトのみを呼び出します。コンテンツ ペイン内に 2 つのパネル (1 つだけ) なしで試してください。

    Container contentPane0 = getContentPane();
    Container contentPane = new JPanel();
    contentPane0.add(contentPane);
于 2012-04-07T01:22:20.480 に答える