Java - 更新JFrame / JLabels中的值

时间:2015-11-04 12:54:54

标签: java swing jframe jlabel

我是Java初学者,几天前我对自己的技能充满信心,开始了我的第一个"大"项目。它基本上是一个计算器,一个GUI(只有JFrame,JPanels,JLabels和Buttons),可以显示数据,接受用户输入,从其他类中获取更多数据,然后计算内容,最后用新的JLabel值更新GUI。但是,我从来没有设法正确完成更新部分,每当我按下“'”按钮时,它会创建一个带有新值的新JFrame,而旧版本仍在运行。

我尝试了显而易见的东西(repaint(),revalidate()等),但这根本不起作用,然后我开始转移,将部分代码放入新类,复制代码网直到它最终工作。然而,代码完全是一团糟,我甚至没有真正理解一开始就出现了什么问题,所以我把整个事情都弄糟了。

在事情发生之前,我的代码是一个非常简化的版本:

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

public class Test_1 extends JFrame {
    public static class clicks{
    static int clicks = 0;
    public int getclicks(){
        return clicks;
    }
    public void setclicks(){
        clicks = clicks+1;
    }
}

public Test_1(){
    clicks getNumber = new clicks();
    int x = getNumber.getclicks();

    //FRAME AND LAYOUT
    JFrame window = new JFrame();
    window.getContentPane().setBackground(Color.darkGray);
    window.getContentPane().setLayout(new BorderLayout(20,10));
    window.setTitle("Test Frame 1");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setResizable(true);



    // Top JPanel
    JPanel northpanel = new JPanel();
    LayoutManager northlayout = new FlowLayout();
    northpanel.setLayout(northlayout);
    // Top JPanel content
    JLabel nlabel1 = new JLabel("Hello North");
    nlabel1.setPreferredSize(new Dimension(100,20));
    northpanel.add(nlabel1);

    JPanel westpanel = new JPanel();
    LayoutManager westlayout = new BoxLayout(westpanel, BoxLayout.Y_AXIS);
    westpanel.setLayout(westlayout);
    JLabel wlabel1 = new JLabel("Hello West");
    wlabel1.setPreferredSize(new Dimension(100,20));
    westpanel.add(wlabel1);

    JPanel eastpanel = new JPanel();
    LayoutManager eastlayout = new BoxLayout(eastpanel, BoxLayout.Y_AXIS);
    eastpanel.setLayout(eastlayout);
    JLabel elabel1 = new JLabel ("Hello East");
    elabel1.setPreferredSize(new Dimension(100,20));
    eastpanel.add(elabel1);

    JButton southbutton = new JButton("start");
    southbutton.setPreferredSize(new Dimension(400,50));
    southbutton.addActionListener(new Action());

    JPanel centralpanel = new JPanel();
    JLabel clabel1 = new JLabel("Clicks: " + x);
    centralpanel.add(clabel1);

    window.add(centralpanel, BorderLayout.CENTER);
    window.add(southbutton, BorderLayout.SOUTH);
    window.add(eastpanel, BorderLayout.EAST);
    window.add(westpanel, BorderLayout.WEST);
    window.add(northpanel, BorderLayout.NORTH);
    window.pack();
    window.setVisible(true);        
}


public static void main(String[] args) {
    Test_1 window_start = new Test_1();
}


static class Action implements ActionListener{  
    @Override
    public void actionPerformed (ActionEvent e){
        clicks Numbers = new clicks();
        Numbers.setclicks();
        int test = Numbers.getclicks();
        System.out.println("Button works, Number of clicks: "+test);
        Test_1 updateData = new Test_1();
    }
}
}

我知道ActionListener会创建一个我的JFrame的新实例,但这是我最接近的那个"更新JFrame"在我把代码变成Spaghetti之前。我假设我构建代码的方式是我的问题的原因,但创建框架及其内容,不同的类根本不起作用。

所以我的问题是:

  1. 我遗失了一些非常明显的东西吗?如果不完全改变它,是否可以按照我想要的方式运行?

  2. 是否有更有效的方法来创建GUI?我觉得我做这个的方式就是垃圾。

  3. 我读过其他涉及类似问题的问题,但也许是因为我在Java方面仍然非常糟糕,但我无法确定它们是否与我的问题有关。另外,我真的很想理解这一点,所以复制别人的代码根本不会有帮助。

    感谢任何帮助或评论。

    顺便说一句,类点击是我刚刚把它作为占位符。

1 个答案:

答案 0 :(得分:0)

好吧我设法让它上班。这可能是针对礼仪来回答他自己的问题,但我认为它可能对一些初学者有用(像我昨天一样)。所以这是我的新代码:

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

public class Test_1 extends JFrame {

public static class clicks{
    static int clicks = 0;
    public int getclicks(){
        return clicks;
    }
    public void setclicks(){
        clicks = clicks+1;
    }
}

clicks getNumber = new clicks();
int x = getNumber.getclicks();
JPanel northpanel, westpanel, eastpanel, southpanel, centralpanel;
static JLabel nlabel1, nlabel2, nlabel3, nlabel4, nlabel5;
static JLabel wlabel1, wlabel2, wlabel3, wlabel4, wlabel5;
static JLabel elabel1, elabel2, elabel3, elabel4, elabel5; 
static JLabel clabel1;
JButton southbutton;
String TextnL, TextwL, TexteL;


public Test_1(){
    setBackground(Color.darkGray);
    setLayout(new BorderLayout(20,10));
    setTitle("Test Frame 1");
    setSize(300,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(true);
    setLocationRelativeTo(null);
    setVisible(true);

    nlabel1 = new JLabel("North_1");
    nlabel2 = new JLabel("North_2");
    nlabel3 = new JLabel("North_3");
    nlabel4 = new JLabel("North_4");
    nlabel5 = new JLabel("North_5");

    wlabel1 = new JLabel("West_1 ");
    wlabel2 = new JLabel("West_2 ");
    wlabel3 = new JLabel("West_3 ");
    wlabel4 = new JLabel("West_4 ");
    wlabel5 = new JLabel("West_5 ");

    elabel1 = new JLabel("East_1");
    elabel2 = new JLabel("East_2");
    elabel3 = new JLabel("East_3");
    elabel4 = new JLabel("East_4");
    elabel5 = new JLabel("East_5");

    clabel1 = new JLabel("START");

    southbutton = new JButton("Process");
    southbutton.addActionListener(new Action());

    northpanel = new JPanel();
    northpanel.add(nlabel1);
    northpanel.add(nlabel2);
    northpanel.add(nlabel3);
    northpanel.add(nlabel4);
    northpanel.add(nlabel5);
    add(northpanel, BorderLayout.NORTH);

    westpanel = new JPanel();
    LayoutManager wBox = new BoxLayout(westpanel, BoxLayout.Y_AXIS);
    westpanel.setLayout(wBox);
    westpanel.add(wlabel1);
    westpanel.add(wlabel2);
    westpanel.add(wlabel3);
    westpanel.add(wlabel4);
    westpanel.add(wlabel5);
    add(westpanel, BorderLayout.WEST);

    eastpanel = new JPanel();
    LayoutManager eBox = new BoxLayout(eastpanel, BoxLayout.Y_AXIS);
    eastpanel.setLayout(eBox);
    eastpanel.add(elabel1);
    eastpanel.add(elabel2);
    eastpanel.add(elabel3);
    eastpanel.add(elabel4);
    eastpanel.add(elabel5);
    add(eastpanel, BorderLayout.EAST);

    centralpanel = new JPanel();
    centralpanel.add(clabel1);
    add(centralpanel, BorderLayout.CENTER);
    add(southbutton, BorderLayout.SOUTH);
}



public static void main(String[] args) {
    Test_1 window_start = new Test_1();
}


static class Action implements ActionListener{  
    @Override
    public void actionPerformed (ActionEvent e){
        clicks Numbers = new clicks();
        Numbers.setclicks();
        int test = Numbers.getclicks();
        clabel1.setText("clicks: "+test);
    }
}
}

同样,欢迎任何意见/建议。