【问题标题】:how do i reference my JLabel message in the buttonhandler?如何在按钮处理程序中引用我的 JLabel 消息?
【发布时间】:2017-03-12 21:56:37
【问题描述】:

基本上!我需要使用 jtextfields 更改最初设置为红色的消息的颜色,所有代码都已完成,除了更改颜色的位,因为我不知道如何引用消息。我知道它需要执行@overide 操作,但它说它无法识别“消息”是什么,我试过 message.setForeground(new Color(a, b, c));但是,是的,任何关于在这里做什么的帮助都会很棒,谢谢。

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



public class CE203_2016_Ex1 extends JFrame {

    JTextField tred, tgreen, tblue;

    public CE203_2016_Ex1() {

        JPanel panel1 = new JPanel();       //creates panels for the boxes that will hold the rgb values
        JPanel panel2 = new JPanel();

        tred = new JTextField("Red", 10);
        tgreen = new JTextField("Green", 10);             //creates boxes for rgb values
        tblue = new JTextField("Blue", 10);

        panel1.add(tred);
        panel1.add(tgreen);                            //adding jtextfields to panels
        panel1.add(tblue);

        add(panel1, BorderLayout.SOUTH); //adding panels to frame
        add(panel2, BorderLayout.CENTER);

        JLabel message = new JLabel("hello");  //text
        message.setForeground(new Color(255, 0, 0));     //original text set to red

        JButton goButton = new JButton("Change");       //adds button to change colour
        panel1.add(goButton);
        panel2.add(message);
        goButton.addActionListener(new ButtonHandler(this));
    }

    class ButtonHandler implements ActionListener {

        private CE203_2016_Ex1 theApp;

        public ButtonHandler(CE203_2016_Ex1 theApp) {
            this.theApp = theApp;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int a = Integer.parseInt(theApp.tred.getText());
            int b = Integer.parseInt(theApp.tgreen.getText());
            int c = Integer.parseInt(theApp.tblue.getText());


        }
    }

    public static void main(String[] args) {
        JFrame app = new CE203_2016_Ex1();
        app.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        app.setSize(700, 700);
        app.setVisible(true);
    }
}

【问题讨论】:

    标签: button jframe jpanel jtextfield rgb


    【解决方案1】:

    您需要在您的应用中公开消息标签。这意味着您必须使 JLabel 消息成为您应用程序的一个字段,然后添加一个 getter 来检索它。这样,任何可以访问您的应用的东西也可以访问消息标签。

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    
    public class CE203_2016_Ex1 extends JFrame {
    
        JTextField tred, tgreen, tblue;
        JLabel message;
    
        public CE203_2016_Ex1() {
    
            JPanel panel1 = new JPanel();       //creates panels for the boxes that will hold the rgb values
            JPanel panel2 = new JPanel();
    
            tred = new JTextField("Red", 10);
            tgreen = new JTextField("Green", 10);             //creates boxes for rgb values
            tblue = new JTextField("Blue", 10);
    
            panel1.add(tred);
            panel1.add(tgreen);                            //adding jtextfields to panels
            panel1.add(tblue);
    
            add(panel1, BorderLayout.SOUTH); //adding panels to frame
            add(panel2, BorderLayout.CENTER);
    
            message = new JLabel("hello");  //text
            message.setForeground(new Color(255, 0, 0));     //original text set to red
    
            JButton goButton = new JButton("Change");       //adds button to change colour
            panel1.add(goButton);
            panel2.add(message);
            goButton.addActionListener(new ButtonHandler(this));
        }
    
        public JLabel getMessageLabel() {
            return message;
        }
    
        class ButtonHandler implements ActionListener {
    
            private CE203_2016_Ex1 theApp;
    
            public ButtonHandler(CE203_2016_Ex1 theApp) {
                this.theApp = theApp;
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                int a = Integer.parseInt(theApp.tred.getText());
                int b = Integer.parseInt(theApp.tgreen.getText());
                int c = Integer.parseInt(theApp.tblue.getText());
                theApp.getMesssageLabel().setForground(new Color(a, b, c));
            }
        }
    
        public static void main(String[] args) {
            JFrame app = new CE203_2016_Ex1();
            app.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            app.setSize(700, 700);
            app.setVisible(true);
        }
    }
    

    重要的部分是:

    JTextField tred, tgreen, tblue;
    
    // Added field message for later use
    JLabel message;
    
    public CE203_2016_Ex1() {
    

    .

    // Enables you to get the message label from your app later on
    public JLabel getMessageLabel() {
        return message;
    }
    
    class ButtonHandler implements ActionListener {
    

    .

    int c = Integer.parseInt(theApp.tblue.getText());
    // Gets the message label from your App and sets its foreground color
    theApp.getMesssageLabel().setForground(new Color(a, b, c));
    

    【讨论】:

      【解决方案2】:

      您正试图从其scope 外部访问变量message,因为您在构造函数中声明了JLabel,它只能由构造函数访问。所以你想在构造函数之外声明 JLabel,就像你对 JTextFields 所做的一样,我也建议将此应用程序设为 private

      【讨论】:

      • 谢谢!我现在已经做到了!我所要做的就是在外面制作一个 Jlabel,就像我对你所说的文本字段所做的那样,然后将它重命名为 message=new JLabel inside,就像我对文本字段所做的那样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多