【问题标题】:textPanel.setText(""); doesn't work or displaytextPanel.setText("");不工作或显示
【发布时间】:2014-03-06 21:02:55
【问题描述】:

每当我在我的 Java GUI 中按“清除”时,它总是不起作用,请帮我完成这个。如果我用另一个按钮替换“textPanel”,它可以工作,否则用“textpanel”它不会。

这是我的代码的一个轻量级版本,演示了这个问题:

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

public class MainFrame extends JFrame {
    private TextPanel textPanel;
    private FormPanel formpanel;

    public MainFrame(){
        super("My Frame");
        createLayout();
        createFrame();
    }

    public void createFrame(){
        setSize(600, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);       
    }

    public void createLayout(){
        BorderLayout myLayout = new BorderLayout();     
        setLayout(myLayout);

        textPanel = new TextPanel();
        formpanel = new FormPanel();

        // adding components
        add(textPanel, BorderLayout.CENTER);
        add(formpanel, BorderLayout.WEST);  
    }

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

    public static class FormPanel extends JPanel {

        private JButton clear;
        private TextPanel textPanel;

        public FormPanel(){
            clear = new JButton("Clear Cart!");
            textPanel=new TextPanel();
            add(clear);

            clear.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent aev){
                    System.out.println("Test");
                    textPanel.setText("");
                }       
            });
            createGrid();               
        }

        /* this methods simply creates the layout  */ 
        void createGrid(){
            //creating layout
            setLayout(new GridBagLayout());     
            GridBagConstraints gc = new GridBagConstraints();

            gc.gridy++;
            gc.weightx = .1;
            gc.weighty = .1;
            gc.gridx = 2;
            gc.gridy=5;
            gc.anchor = GridBagConstraints.LINE_START; 
            gc.insets = new Insets(0,0,0,0);

            add(clear, gc);

        }
    }

    public static class TextPanel extends JPanel {
        private JTextArea textArea;

        TextPanel (){
            textArea = new JTextArea();
            setLayout(new BorderLayout());

            JScrollPane p = new JScrollPane(textArea);
            add(p, BorderLayout.CENTER);
        }

        public void appendSomeText(String t){
            textArea.append(t);     
        }

        public void setText(String s){
            textArea.setText(s);
        }
    }
}

【问题讨论】:

  • 你的问题是什么?
  • 如何让我的清除按钮真正清除文本面板?
  • 代码太过分了,请将此代码转储更改为SSCCE,没有人愿意查看所有内容。
  • 按下按钮时是否有任何控制台输出?
  • 我什么也没得到,它根本不影响 textPanel。

标签: java swing jbutton jtextarea settext


【解决方案1】:

您有两个TextPanel 实例,一个在MainFrame 中,另一个在FormPanel 中。在FormPanel 中定义的TextPanel 实际上并没有添加到面板中,因此textPanel.setText(""); 对其没有影响,因为它不可见。

当文本附加Add To Cart! 按钮时,它实际上通过MainFrame - formEventOccurred() 中的一个方法执行textPanel.appendSomeText()。这是TextPanel 的另一个实例,它是MainFrame 的一部分,它实际上是可见的。

看起来您需要将重复的逻辑从主框架移动到面板。通常你不应该扩展JFrame,因为你没有添加任何新功能。

【讨论】:

  • 但是当我摆脱 textPanel=new TextPanel();从 FormPanel 我的 textPanel.setText("");说 java.lang.NullPointerException
  • 当我从 MainFrome 中删除它时,程序会出现问题并且不显示任何按钮或面板。
  • @user3389471 毫无疑问,您需要重构和重组您的程序。就像现在一样,您不能简单地评论一行并使其工作。清理MainFrame,它只是一个顶级容器。它应该包含您的面板,但不包含操作逻辑。查看How to Use Actions,以便您可以隔离和重用面板和工具栏中的功能。
  • @Aqua 我想这很公平 - 这是你的答案。就个人而言,我觉得如果我可以帮助使答案更清楚,那不是一件坏事。我的理念是给他们他们正在寻找的答案,并指出是否有更好的方法,然后希望它采取。但我承认还有其他观点。感谢您解决它!
  • 这是.. 很遗憾,但我修复了它!我做到了,所以我可以通过创建一个方法并使用 this.textPanel = textPanel; 来调用 formpanel 中的 textpanel。我在TextPanel 中创建了一个方法,它将setText 变为空白。然后在我的大型机中我简单地输入formpanel.setCart(textPanel);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多