我正在研究使用GUI的探路者程序。在添加一些东西之前,我尝试运行该程序,结果显示一切正常。但是在处理了更多内容之后,它停止显示按钮和菜单栏。

这是代码。瑞典语中也有一些变量名,但我希望这不会成为问题。 (请记住,该程序尚未完成。)
先感谢您!

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class Pathfinder extends JFrame {

    JButton hittaVäg, visaFörbindelse, nyPlats, nyFörbindelse, ändraFörbindelse;
    JMenuBar menyBar;
    JMenuItem ny, avsluta, hittaVägMeny, visaFörbindelseMeny, nyPlatsMeny, nyFörbindelseMeny, ändraFörbindelseMeny;
    String str = System.getProperty("user.dir");
    JFileChooser jfc;
    BildPanel Bild = null;

    Pathfinder(){

        super("PathFinder");
        setLayout(new BorderLayout());
        setSize(590, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
        jfc = new JFileChooser(".");

        JPanel norra = new JPanel();
        add(norra, "norra");


        JButton hittaVäg = new JButton("Hitta väg");
        JButton visaFörbindelse = new JButton("Visa förbindelse");
        JButton nyPlats = new JButton("Ny plats");
        JButton nyFörbindelse = new JButton("Ny förbindelse");
        JButton ändraFörbindelse = new JButton("Ändra förbindelse");

        norra.add(hittaVäg);
        norra.add(visaFörbindelse);
        norra.add(nyPlats);
        norra.add(nyFörbindelse);
        norra.add(ändraFörbindelse);

        hittaVäg.addActionListener(new HittaLyss());
        visaFörbindelse.addActionListener(new VisaLyss());
        nyPlats.addActionListener(new NyPlatsLyss());
        nyFörbindelse.addActionListener(new NyFörbindelseLyss());
        ändraFörbindelse.addActionListener(new NyFörbindelseLyss());


        JMenuBar menyBar = new JMenuBar();
        setJMenuBar(menyBar);

        JMenu arkivMeny = new JMenu("Arkiv");
        JMenu operationerMeny = new JMenu("Operationer");

        menyBar.add(arkivMeny);
        menyBar.add(operationerMeny);


        JMenuItem ny = new JMenuItem("Ny");
        JMenuItem avsluta = new JMenuItem("Avsluta");

        arkivMeny.add(ny);
        arkivMeny.add(avsluta);

        ny.addActionListener(new NyLyss());
        avsluta.addActionListener(new AvslutaLyss());


        JMenuItem hittaVägMeny = new JMenuItem("Hitta väg");
    JMenuItem visaFörbindelseMeny = new JMenuItem("Visa förbindelse");


        JMenuItem nyPlatsMeny = new JMenuItem("Ny plats");
        JMenuItem nyFörbindelseMeny = new JMenuItem("Ny förbindelse");
        JMenuItem ändraFörbindelseMeny = new JMenuItem("Ändra förbindelse");

        operationerMeny.add(hittaVägMeny);
        operationerMeny.add(visaFörbindelseMeny);
        operationerMeny.add(nyPlatsMeny);
        operationerMeny.add(nyFörbindelseMeny);
        operationerMeny.add(ändraFörbindelseMeny);

        hittaVäg.addActionListener(new HittaLyss());
        visaFörbindelse.addActionListener(new VisaLyss());
        nyPlats.addActionListener(new NyPlatsLyss());
        nyFörbindelse.addActionListener(new NyFörbindelseLyss());
        ändraFörbindelse.addActionListener(new ÄndraFörbindelseLyss());




    }

    class HittaLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    class VisaLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    class NyPlatsLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    class NyFörbindelseLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    class ÄndraFörbindelseLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    class NyLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){
            int svar = jfc.showOpenDialog(Pathfinder.this);
            if (svar == JFileChooser.APPROVE_OPTION){
                File f = jfc.getSelectedFile();
                String filnamn = f.getAbsolutePath();
                if (Bild != null)
                    remove(Bild);
                Bild = new BildPanel(filnamn);
                add(Bild, BorderLayout.CENTER);
                validate();
                repaint();
                pack();
            }
        }

    }
    class AvslutaLyss implements ActionListener{
        public void actionPerformed(ActionEvent ave){

        }

    }
    public static void main (String[] args){
        new Pathfinder();
    }
}

最佳答案

问题之一是在线的IllegalArgumentException

add(norra, "norra");

框架内容窗格的布局设置为BorderLayout,但是此布局无法理解"norra"约束。有关更多详细信息和示例,请参见How to Use BorderLayout

同样,一旦添加并初始化了所有组件,就应该调用setVisible

07-26 04:14