gpt4 book ai didi

java - 多个 JLabel 不打印在屏幕上

转载 作者:行者123 更新时间:2023-11-30 03:43:20 24 4
gpt4 key购买 nike

我想根据您首先在文本字段中写入的数字(不允许字符串)打印多个标签。我希望它是动态的。我希望每次您在文本字段中输入内容时它都会改变。

到目前为止,它可以读取数字或字符串,如果文本不符合要求,则抛出异常。

我尝试了多种方法在屏幕上打印多个 Jlabel,但到目前为止还没有成功。

这是代码:你能帮我吗?

主窗口类

public class MainWindow extends JFrame {
private MainPanel mp = new MainPanel();
public MainWindow()
{
this.setVisible(true);
this.setTitle("Calculateur sur 100");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200, 400);
this.setLocationRelativeTo(null);
this.setContentPane(mp);

}}

mainPanel类

public class MainPanel extends JPanel implements ActionListener, MouseListener, KeyListener {

private JTextField tI = new JTextField("Pourcentage");
private JOptionPane jop3 = new JOptionPane();

public MainPanel()
{
this.add(tI);
tI.addKeyListener(this);
tI.addMouseListener(this);


}

//Mathematic calculation
private double onHundred(int tot, int now)
{

return (tot / 100) * now;
}
public void keyReleased(KeyEvent e)
{
boolean ok = true;
try
{
int numbs = Integer.parseInt(tI.getText());
}
catch(Exception s)
{
tI.setText("");
jop3.showMessageDialog(null, "Veuillez entrer seulement des chiffres", "Erreur", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if(ok)
{
System.out.print("Supposed to print");
JLabel[] label = new JLabel[Integer.parseInt(tI.getText())];
for(int i = Integer.parseInt(tI.getText()); i <= 0; i--)
{
label[i] = new JLabel(i + " = " + Math.ceil(onHundred(Integer.parseInt(tI.getText()), i)));
label[i].setVisible(true);
this.add(label[i]);
}
}

}

最佳答案

您的MainWindow类应该看起来像这样:

public class MainWindow extends JFrame {

private MainPanel mp = new MainPanel();

public static void main(String[] args) {

new MainWindow();
}

public MainWindow() {

setContentPane(mp);
setTitle("Calculateur sur 100");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
}

注意顺序:setContentPane 然后 pack 然后 setVisiblepack 取代了 setSize,因为它根据其组件确定窗口的首选大小。

我修改了您的 MainPanel 类:

public class MainPanel extends JPanel {

private JTextField tI = new JTextField("Pourcentage");
JPanel labelPanel = new JPanel();

public MainPanel() {

setLayout(new BorderLayout());
tI.getDocument().addDocumentListener(new MyDocumentListener());
add(tI, BorderLayout.PAGE_START);
add(labelPanel);
}

private int check() {

int numL;
try {
numL = Integer.parseInt(tI.getText());
} catch (NumberFormatException exc) {
return 0;
}
return numL > 100? 100 : numL;
}

private void update(int numL) {

labelPanel.removeAll();
for (int i = 0; i < numL; i++)
labelPanel.add(new JLabel(String.valueOf(i+1)));

JFrame mainWindow = ((JFrame) SwingUtilities.getWindowAncestor(this));
mainWindow.pack();
mainWindow.repaint();
}

class MyDocumentListener implements DocumentListener {

@Override
public void insertUpdate(DocumentEvent e) {

update(check());
}

@Override
public void removeUpdate(DocumentEvent e) {

update(check());
}

@Override
public void changedUpdate(DocumentEvent e) {

}
}
}

说明:

  • 主面板的文本字段与另一个面板分开,后者会动态更新以包含标签。
  • 文本字段使用 DocumentListener 而不是 KeyListener 来监听其内容的更改。这是正确的方法,出于多种原因,除非确实必要,否则我不会进入这里。
  • 每当文本发生更改时,check 方法都会验证输入是否为数字。如果不是,则返回 0。如果大于 100,则返回 100。您可以根据需要更改此行为。
  • 来自 check 的值被传递给 update,它会清除所有以前的标签并重建它们。 (如果您愿意,可以在此处进行一些优化,将标签保留在内存中但不显示它们。如果上限为 100,如我的示例所示,则不会引人注目。)。然后主框架重新计算所有标签所需的空间,然后重新绘制。
  • 标签彼此相邻显示,因为 JPanel 的默认布局是 FlowLayout。您可以根据需要更改此设置。

关于java - 多个 JLabel 不打印在屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com