【问题标题】:Changing JTextFields when not within a certain range & changing JPanel background using text from JTextFields当不在某个范围内时更改 JTextFields 并使用 JTextFields 中的文本更改 JPanel 背景
【发布时间】:2018-09-17 20:12:21
【问题描述】:

我环顾四周,发现了迄今为止对我有帮助的各种信息,但我目前遇到以下问题:

  1. 如果我的 JTextField 超出 (0-255) 的范围,则它们不会更改为 0。

  2. 在单击其中一个按钮之前,JPanel 不会根据在 JTextFields 中键入的内容更改颜色。

这是我目前拥有的代码:

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

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

public class App1 extends JFrame implements ActionListener
    {
            JPanel upperBase, lowerBase, jpRed, jpGreen, jpBlue, jpChanging;
            JLabel jLRed, jLGreen, jLBlue;
            JTextField jtf_red, jtf_green, jtf_blue;
            JButton rP, rM, gP, gM, bP, bM;

        public static void main(String[] args) 
    {
        App1 app = new App1();
    } 

    App1()
{
    // Creates Container
    // Sets Layout for Container
    Container cp = this.getContentPane();
    cp.setLayout(new BoxLayout (cp, BoxLayout.Y_AXIS));

     // Sets Window Title and Size
     // Exits Application on Close
    this.setTitle("Application 1");
    this.setSize(800, 600);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Creates 6 JPanels
    upperBase = new JPanel();
    lowerBase = new JPanel();
    jpRed = new JPanel();
    jpGreen = new JPanel();
    jpBlue = new JPanel();
    jpChanging =  new JPanel();

    // Adds upper/lowerBase to Container
    cp.add(upperBase);
    cp.add(lowerBase);

    // Sets Layout for upper/lowerBase
    upperBase.setLayout(new GridLayout(1,3));
    lowerBase.setLayout(new GridLayout(1,1));

    // Sets Color for jpRed/Green/Blue
    jpRed.setBackground(Color.RED);
    jpGreen.setBackground(Color.GREEN);
    jpBlue.setBackground(Color.BLUE);
    jpChanging.setBackground(Color.BLACK);

    // Adds jpRed/Green/Blue to upperBase & adds jpChanging to lowerBase
    upperBase.add(jpRed);
    upperBase.add(jpGreen);
    upperBase.add(jpBlue);
    lowerBase.add(jpChanging);

    // Setup for Red JPanel (jpRed)
    jLRed = new JLabel("Red");
    jtf_red = new JTextField("0", 10);

    rP = new JButton("+");
    rM = new JButton("-");
    rP.addActionListener(this);
    rM.addActionListener(this);
    rP.setPreferredSize(new Dimension(25, 25));
    rM.setPreferredSize(new Dimension(25, 25));

    jpRed.add(jLRed);
    jpRed.add(rP);
    jpRed.add(jtf_red);
    jpRed.add(rM);


    // Setup for Green JPanel (jpGreen)
    jLGreen = new JLabel("Green");
    jtf_green = new JTextField("0", 10);

    gP = new JButton("+");
    gM = new JButton("-");
    gP.addActionListener(this);
    gM.addActionListener(this);
    gP.setPreferredSize(new Dimension(25, 25));
    gM.setPreferredSize(new Dimension(25, 25));

    jpGreen.add(jLGreen);
    jpGreen.add(gP);
    jpGreen.add(jtf_green);
    jpGreen.add(gM);

    // Setup for Blue JPanel (jpBlue)
    jLBlue = new JLabel("Blue");
    jtf_blue = new JTextField("0", 10);

    bP = new JButton("+");
    bM = new JButton("-");
    bP.addActionListener(this);
    bM.addActionListener(this);
    bP.setPreferredSize(new Dimension(25, 25));
    bM.setPreferredSize(new Dimension(25, 25));

    jpBlue.add(jLBlue);
    jpBlue.add(bP);
    jpBlue.add(jtf_blue);
    jpBlue.add(bM);

    // Visibility
    this.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    int red = Integer.parseInt(jtf_red.getText());
    int green = Integer.parseInt(jtf_green.getText());
    int blue = Integer.parseInt(jtf_blue.getText());

    // PLUS & MINUS, NO DECREMENTS PAST 0 and INCREMENTS PAST 255
    if(e.getSource() == rP)
    {
        red++;
        jtf_red.setText("" + red);

        if (red > 255)
        {
            jtf_red.setText("" + 255);
        }
    }
    else if(e.getSource()  == rM)
    {
        red--;
        jtf_red.setText("" + red);

        if (red < 0)
        {
            jtf_red.setText("" + 0);

        }
    }

    if(e.getSource() == gP)
    {
        green++;
        jtf_green.setText("" + green);

        if (green > 255)
        {
            jtf_green.setText("" + 255);
        }
    }
    else if(e.getSource()  == gM)
    {
        green--;
        jtf_green.setText("" + green);

        if (green < 0)
        {
            jtf_green.setText("" + 0);
        }
    }

    if(e.getSource() == bP)
    {
        blue++;
        jtf_blue.setText("" + blue);

        if (blue > 255)
        {
            jtf_blue.setText("" + 255);
        }
    }
    else if(e.getSource()  == bM)
    {
        blue--;
        jtf_blue.setText("" + blue);

        if (blue < 0)
        {
            jtf_blue.setText("" + 0);
        }
    }       

    // LIMITS (0-255)
    if (red < 0)
    {
        jtf_red.setText("" + 0);
    }
    else if (red > 255)
    {
        jtf_red.setText("" + 255);
    }

    if (green < 0)
    {
        jtf_green.setText("" + 0);
    }
    else if (green > 255)
    {
        jtf_green.setText("" + 255);
    }

    if (blue < 0)
    {
        jtf_blue.setText("" + 0);
    }
    else if (blue > 255)
    {
         jtf_blue.setText("" + 255);
    }

    jpChanging.setBackground(new Color(red, green, blue));
}

}

任何帮助将不胜感激!

如果需要更多上下文/说明,我已附上我的作业guidelines。以及程序应该是什么look like(我的程序看起来很像,我更担心功能而不是程序看起来完全一样)。

这是我第一次发帖,所以我希望我做的一切都是正确的!感谢您的宝贵时间!

【问题讨论】:

    标签: java jpanel jtextfield rgb


    【解决方案1】:

    我问了同学们他们是怎么做的,我想通了。

    首先,我的按钮,我的代码很糟糕(我在下面放了一段代码以突出我的观点)。我不知道该怎么解释,但是

    if(e.getSource() == rP)
        {
            red++;
            jtf_red.setText("" + red);
    
            if (red < 255)
            {
                jtf_red.setText("" + 255);
            }
        }
        else if(e.getSource()  == rM)
        {
            red--;
            jtf_red.setText("" + red);
    
            if (red < 0)
            {
                jtf_red.setText("" + 0);
    
            }
    

    Red 在 red++ 中递增;行,但不检查它是否超过 255。

    正确的方法是移动红色++;到

    里面的if语句
    if(e.getSource() == rP)
      {
        if (red < 255)
        {
           red++;
           ...
        }
       }
    

    其他按钮以此类推。

    我的第一个问题的解决方案

    如果我的 JTextField 超出 (0-255) 的范围,则它们不会更改为 0。

    在对 if 语句进行编码后,我需要将 ActionListener 添加到 JTextFields,如果输入的值不在范围内,则将 JTextFields 设置为 0。

    我的第二个问题的解决方案

    在单击其中一个按钮之前,JPanel 不会根据在 JTextFields 中键入的内容更改颜色。

    将 ActionListener 添加到按钮和 JTextField 中后,我创建了一个 if 语句来检查源是按钮还是 JTextField 来更改背景。

    【讨论】:

      【解决方案2】:

      为了更好地维护您的代码,我强烈建议您为每个按钮实现单独的操作侦听器。

      编辑:

      多个 ActionListener 示例

      public class App1 extends JFrame
      {
        JButton red, blue;
        public static void main(String[] args) 
        {
          App1 app = new App1();
        } 
         App1()
         {
            red = new JButton("Red");
            red.addActionListener(new RedListener());
      
            blue = new JButton("Blue");
            blue.addActionListener(new BlueListener());
      
            //Other code creating JPanel, adding components to it etc.
         }
         class RedListener implements ActionListener{
          @Override
          public void actionPerformed(ActionEvent e) {
          //Your program logic here. Implement what you want to happen after user clicks red button
          }
      
          class BlueListener implements ActionListener{
          @Override
          public void actionPerformed(ActionEvent e) {
          //Your program logic here. Implement what you want to happen after user clicks blue button
          }
      }
      

      在上面的代码中,RedListener 和 BlueListener 类是外部 App1 类的内部类。

      【讨论】:

      • 嘿 Emre,感谢您的回复。你知道我将如何实现单独的动作监听器或有一个例子吗?对于这个类,我们对 Java 还是很陌生。我也想到了这一点,并查了一些东西,但没有成功。而对于第二部分......我不确定你的意思,因为我的按钮工作?所以它必须输入if语句,不是吗?还是说它跳过了我的 if 内部的 if 并将它们分开?
      • 谢谢你的例子,我实际上发现了我的代码有什么问题。我本可以像您设置的那样使用多个 ActionListener,但我相信我的教授希望我们将它们全部编码成一个。但是为了组织起见,如果我为每个按钮都做一个 ActionListener 会很有帮助。
      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2017-02-10
      • 2021-08-29
      • 2015-09-15
      相关资源
      最近更新 更多