1

我在一个名为的类中有一个标签和一个按钮FrameTest,当我按下按钮时,一个名为buttonpressedget 的方法会从该类中执行Test。在这种buttonpressed方法中,我将为类中找到的标签设置一个文本FrameTest

我遇到的问题是,标签的文本没有设置。原因是我正在创建一个单独的对象来调用该buttonpressed方法;

public void actionPerformed(ActionEvent arg0) {
                    Test t = new Test();
                    t.buttonpress();
                }

我在Test类的主要方法中创建一个单独的对象来创建 UI。

public static void main(String[] args) {

         FrameTest f = new FrameTest();
         f.mainScreen();

    }

完整代码如下;

public class FrameTest extends JFrame {

private JPanel contentPane;
private JLabel lblLabel;
private FrameTest ft = this;

//private FrameTest frame;
/**
 * Launch the application.
 */
public  void mainScreen() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                //FrameTest frame = new FrameTest();
                //setVisible(true);

                FrameTest frame = ft;
                frame.setVisible(true);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public void writeLabel(String k){
    this.lblLabel.setText(k);

}

public FrameTest() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setExtendedState(JFrame.MAXIMIZED_BOTH); 

    //setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    lblLabel = new JLabel("LABEL");
    contentPane.add(lblLabel, BorderLayout.CENTER);

    JButton btnNewButton = new JButton("Press");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Test t = new Test();
            t.buttonpress();
        }
    });
    contentPane.add(btnNewButton, BorderLayout.WEST);
    //pack();
    setLocationByPlatform(true);
}

}

测试班

public class Test {


public static void main(String[] args) {

     FrameTest f = new FrameTest();
     f.mainScreen();

}

public void buttonpress(){
     FrameTest f = new FrameTest();

     f.writeLabel("Button was pressed");

}
4

4 回答 4

3

JFrame1)不要不必要地扩展类。

setContentPane()2)除非那是你想要的,否则不要使用。而只是简单地JFrame#add(..)

3)远离EventQueue并使用SwingUtilities块而不是

4)不要忘记JFrame#pack();在设置JFrame可见之前调用。

5) Java 命名约定是 CamelCase 所以buttonPress()不正确buttonpress()

这是我做的一个例子(基本上你的代码是固定的):

Test.java:(这是主类,它将创建您的实例FrameTest并具有更改JLabel文本的方法)

import javax.swing.SwingUtilities;

public class Test {

    private static FrameTest f;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                f = new FrameTest();
                f.mainScreen();
            }
        });
    }

    void buttonPress() {
        f.writeLabel("Hello");
    }
}

FrameTest.java:(该类将显示JFrame并创建Test要调用的类的新实例buttonPress()):

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class FrameTest {

    private JPanel panel;
    private JLabel lblLabel;
    private JFrame frame;

    private void initComponents() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

        panel = new JPanel();
        panel.setBorder(new EmptyBorder(5, 5, 5, 5));
        panel.setLayout(new BorderLayout(0, 0));

        lblLabel = new JLabel("LABEL");
        panel.add(lblLabel, BorderLayout.CENTER);

        JButton btnNewButton = new JButton("Press");
        btnNewButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Test t = new Test();
                t.buttonPress();
            }
        });

        panel.add(btnNewButton, BorderLayout.WEST);

        frame.add(panel);

        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public void writeLabel(String k) {
        this.lblLabel.setText(k);
    }

    void mainScreen() {
        initComponents();
    }
}
于 2012-11-21T08:27:50.720 回答
1

将您的 FrameTest 对象传递给 buttonpress 方法并在那里使用它,而不是创建一个新对象:

public void buttonpress(FrameTest f) {
     f.writeLabel("Button was pressed");    
}

像这样更改方法的调用:

btnNewButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Test t = new Test();
        t.buttonpress(FrameTest.this);
    }
});

您必须在FrameTest.this此处使用,因为您在实现 ActionListener 的匿名类中,因此正常this会引用该匿名类。

于 2012-11-21T07:01:18.237 回答
1

-第一种方法是使用CompositionPrinciple,在其中创建 in 的实例然后使用该实例在类中访问(在 FrameTest 中使用 Getter Setters 来获取此标签)。FrameTest.javaTest.java classLabelFrameTest.java

-第二种方法是一种肮脏且快速的修复方法,Label staticFrameTest.java类中创建并直接从Test.java类中设置值。瞧,它完成了......

-您的代码无法正常工作的原因是您创建了一个非常新的FrameTest class. 因此,现在您要么将FrameTest 对象引用变量传递给buttonpress()方法,要么将其设为label 静态

例如:

public class FrameTest extends JFrame {

private JPanel contentPane;
public static JLabel lblLabel;

.....

.....

}

或者

public void buttonpress(FrameTest f) {
     f.writeLabel("Button was pressed");    
}

///////////////////////////////////////////////////////////////////////// //////////////

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

class FrameTest extends JFrame {

    private JPanel contentPane;
    private JLabel lblLabel;
    private FrameTest ft = this;

    public void mainScreen() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {

                    FrameTest frame = ft;
                    frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void writeLabel(String k) {
        this.lblLabel.setText(k);

    }

    public FrameTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(JFrame.MAXIMIZED_BOTH);

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        lblLabel = new JLabel("LABEL");
        contentPane.add(lblLabel, BorderLayout.CENTER);

        JButton btnNewButton = new JButton("Press");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Test t = new Test();

                t.buttonpress(FrameTest.this); // Passing the current object to
                                                // the Test class
                                                // You can use just "this" , but
                                                // as we are in an Anonymous
                                                // Inner Class here,
                                                // we have to use
                                                // "Class_name.this"

            }
        });
        contentPane.add(btnNewButton, BorderLayout.WEST);
        // pack();
        setLocationByPlatform(true);
    }

}

public class Test {

    public static void main(String[] args) {

        FrameTest f = new FrameTest();
        f.mainScreen();

    }

    public void buttonpress(FrameTest f) { // Receiving the reference to the
                                            // current frame, but remember
                                            // THOUGH IT SEEMS that we are passing the
                                            // reference but still in
                                            //  Here and in Java its always pass
                                            // by copy.( ie pass by value).

        f.writeLabel("Button was pressed");

    }
}
于 2012-11-21T07:05:27.293 回答
0

Test只需像下面这样更改您的课程

package com.test;

public class Test {

    private static FrameTest f;

    public static void main(String[] args) {

        f = new FrameTest();
        f.mainScreen();

    }

    public void buttonpress() {
        f.writeLabel("Button was pressed");
    }
}

实际的问题是

  1. 您在 main 中创建了一个FrameTest变量f并向用户显示 UI。
  2. 然后按下按钮,您再次创建了另一个FrameTest实例f,它不映射原始/第一个f

现在我将变量视为类变量,它按预期工作

于 2012-11-21T08:56:37.387 回答