繁体   English   中英

单击JmenuItem时更新边框标题

[英]Update border title when JmenuItem is clicked

请问我的问题有点复杂,单击JMenuItem时尝试更新Jpanel的borderTitle,我有3个类,A实现ActionListener,B是JPanel类,C是JFrame类,这是我尝试过的已经

public class PanelTitle implements ActionListener{
     String title;
    public PanelTitle(){
    }                     
    @Override
    public void actionPerformed(ActionEvent ae){
         SedimentPanel sp = new SedimentPanel();
         sp.titledBorder.setTitle("SEDIMENT");

         sp.repaint();
         sp.revalidate();


    }
}

我在我的JFrame类中有这个

 velocityMenuItem.addActionListener(new PanelTitle());

这是我的JPanel课程

public class SedimentPanel extends JPanel{
    public SedimentPanel(){
        super();
        initComponents();
        initPlaceHolders();
        setBorder(titledBorder); 

    }

    TitledBorder titledBorder = BorderFactory.createTitledBorder(null, "border title",TitledBorder.CENTER,TitledBorder.DEFAULT_POSITION);

}

请单击JMenuItem时如何真正更改borderTitle? 这是我在框架类中引用它的方式,现在我收到了Nullpointer异常

public class FrameClass extends JFrame{
private static SedimentPanel sp;
    public FrameClass(SedimentPanel sp){
        this.sp = sp;}
}
public static void main(String args[]){
 FrameClass fc = new FrameClass(sp);
}

您在这里犯了一个基本错误:

public class PanelTitle implements ActionListener{
     String title;
    public PanelTitle(){
    }                     
    @Override
    public void actionPerformed(ActionEvent ae){
         SedimentPanel sp = new SedimentPanel(); // ********
         sp.titledBorder.setTitle("SEDIMENT");

         sp.repaint();
         sp.revalidate();
    }
}

新的SedimentPanel是一个全新的引用,对其调用方法将不会对原始显示的对象产生影响。 不要这样做,获取适当的引用并在其上调用方法。

public class PanelTitle implements ActionListener{
    String title;
    private SedimentPanel sp;

    public PanelTitle(SedimentPanel sp){  // pass in reference
        this.sp = sp;
    }

    @Override
    public void actionPerformed(ActionEvent ae){
         // SedimentPanel sp = new SedimentPanel(); // ******** NO
         // sp.titledBorder.setTitle("SEDIMENT");
         sp.setTitle("SEDIMENT"); // better to give the class this method
         sp.repaint();
         sp.revalidate();
    }
}

public class SedimentPanel {
    private TitledBorder titledBorder = ....;

    public void setTitle(String title) {
        titledBorder.setText(title);
    }
}   

然后,在创建此侦听器时,将适当的引用传递给实际的可视化 JPanel。

您正在犯此错误表明,阅读或重新阅读文本中有关对象/引用是什么以及它代表什么的不错的章节不会对您造成危害,因为这是您所犯的根本性错误。

一个工作示例:

import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class TitleExample {

    private static void createAndShowGui() {
        SedimentPanel sedimentPanel = new SedimentPanel();
        PanelTitle panelTitle = new PanelTitle(sedimentPanel); // pass in the reference
        JMenuItem menuItem = new JMenuItem("SEDIMENT");
        menuItem.addActionListener(panelTitle);
        JMenu jMenu = new JMenu("Menu");
        jMenu.add(menuItem);
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(jMenu);

        JFrame frame = new JFrame("TitleExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(sedimentPanel);
        frame.setJMenuBar(menuBar);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

class SedimentPanel extends JPanel {
    private TitledBorder titledBorder = BorderFactory.createTitledBorder(null, "border title", TitledBorder.CENTER,
            TitledBorder.DEFAULT_POSITION);

    public SedimentPanel() {
        super();
        setBorder(titledBorder);
        setPreferredSize(new Dimension(400, 300));
    }

    public void setTitle(String title) {
        titledBorder.setTitle(title);
        repaint();
    }

}

class PanelTitle implements ActionListener{
    String title;
    private SedimentPanel sp;

    public PanelTitle(SedimentPanel sp){  // pass in reference
        this.sp = sp;
    }

    @Override
    public void actionPerformed(ActionEvent ae){
         sp.setTitle("SEDIMENT"); // better to give the class this method
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM