java - 自定义 JLabel 清理

标签 java swing jlabel

我每次都需要在 textField Action 上清理我的 labelResult,但第一次它在字符串前面添加“null”,然后 - 之后立即打印新字符串。请帮忙。

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


public class Frame extends JFrame implements ActionListener {
    boolean isDirect = true;
    String[] typeStr = {"direct", "invert"};
    JLabel labelTip = new JLabel("Choose 'direct' OR 'invert' to print your next line in direct order or inverted respectively.");
    JTextField textField = new JTextField("Some text!", 40);
    JComboBox comboBox = new JComboBox(typeStr);
    EventProcessing eventProcessing = new EventProcessing();
    JLabel labelResult = new JLabel();

    public Frame() {
        setLayout(new BorderLayout());
        getContentPane().add(labelTip, BorderLayout.PAGE_START);
        getContentPane().add(comboBox, BorderLayout.CENTER);
        getContentPane().add(textField, BorderLayout.AFTER_LINE_ENDS);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        textField.addActionListener(this);

        pack();
    }

    public void actionPerformed(ActionEvent e) {
        getContentPane().remove(labelResult);
        labelResult = new JLabel();
        labelResult.setText("");
        if (!(comboBox.getSelectedItem()).equals("direct")) {
            isDirect = false;
        }
        else {
            isDirect = true;
        }
        labelResult.setText(eventProcessing.action(isDirect, textField.getText()));
        getContentPane().add(labelResult, BorderLayout.PAGE_END);

        pack();

    }
}

最佳答案

@Tim 我知道在关于 JComboBox 的官方教程中使用 ActionListener,但对于从 JComboBox 到 GUI 的任何操作,最好查找 ItemListener ,你有两种状态(总是被调用两次,但你可以通过换行到 if ... else 来在这两个选项 SELECTED/DESELECTED 之间过滤)

你的代码应该只是

Runnable doRun = new Runnable() {

   @Override
   public void run() {
      labelResult.setText(eventProcessing.action(isDirect, textField.getText()));
      add(labelResult, BorderLayout.PAGE_END);
      //1) this.pack(); if you want to re-layout with effect to size of JFrame too

      //2a revalidate(); 
      //2b plus in most cases
      //2b repaint(); relayout Container with fitting JComponents inside Container, 
      //2b but without resize of JFrame
   }
};
SwingUtilities.invokeLater(doRun);

关于java - 自定义 JLabel 清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179860/

相关文章:

java - 无滚动条 - 带 JPanel 的 JScrollPane

java - java 被滥用的背景

java - 强制显示 JLabel 子类

java - 在 JLabel 中的某些文本上监听 MouseEvents

java - Wicket:如何使用 <a href ="..."target ="_blank"> 创建外部链接

java - 扩展 fragment 中的 fragment 实例化异常

java - 如何从服务器请求中获取文件名?

java - 如何在 macOS 上设置或更改默认 Java (JDK) 版本?

java - 从 JComboBox 控件重绘

java - 摆弄 Java Graphics,这工作_一次_