在不在特定范围内时更改 JTextFields 并使用来自 JTextFields 的文本更改 JPanel 背景
Changing JTextFields when not within a certain range & changing JPanel background using text from JTextFields
我环顾四周,找到了迄今为止对我有帮助的各种信息,但我目前遇到以下问题:
如果 JTextFields 在 (0-255) 的范围之外,它们不会更改为 0。
在单击其中一个按钮之前,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));
}
}
如有任何帮助,我们将不胜感激!
如果需要更多 context/instruction,我附上了我的作业 guidelines. As well as what the program is supposed to look like(我的程序看起来很像,我更担心功能而不是看起来完全一样的程序)。
这是我第一次发帖,希望我做对了!感谢您的宝贵时间!
为了更好地维护您的代码,我强烈建议您为每个按钮实现单独的动作侦听器。
编辑:
多个 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 classes 是外部 App1 class 的内部 classes class.
问过同学们是怎么做到的,我想通了。
首先,我的按钮,我的代码很糟糕(我在下面放了一段以强调我的观点)。我不知道该如何解释,但是
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);
}
红色在红色++中递增;行,但不检查它是否超过 255。
正确的方法应该是移动红色++;到
中的 if 语句
if(e.getSource() == rP)
{
if (red < 255)
{
red++;
...
}
}
其他按钮依此类推。
我的第一个问题的解决方案
My JTextFields do not change to 0 if they're outside of the range of (0-255).
我需要在编写 if 语句后将 ActionListener 添加到 JTextFields,如果输入的值不在范围内,则将 JTextFields 设置为 0。
我的第二个问题的解决方案
The JPanel does not change colors based off what is typed in the JTextFields until one of the buttons is clicked.
将 ActionListener 添加到按钮和 JTextFields 后,我创建了一个 if 语句来检查源是按钮还是 JTextFields 以更改背景。
我环顾四周,找到了迄今为止对我有帮助的各种信息,但我目前遇到以下问题:
如果 JTextFields 在 (0-255) 的范围之外,它们不会更改为 0。
在单击其中一个按钮之前,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));
}
}
如有任何帮助,我们将不胜感激!
如果需要更多 context/instruction,我附上了我的作业 guidelines. As well as what the program is supposed to look like(我的程序看起来很像,我更担心功能而不是看起来完全一样的程序)。
这是我第一次发帖,希望我做对了!感谢您的宝贵时间!
为了更好地维护您的代码,我强烈建议您为每个按钮实现单独的动作侦听器。
编辑:
多个 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 classes 是外部 App1 class 的内部 classes class.
问过同学们是怎么做到的,我想通了。
首先,我的按钮,我的代码很糟糕(我在下面放了一段以强调我的观点)。我不知道该如何解释,但是
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);
}
红色在红色++中递增;行,但不检查它是否超过 255。
正确的方法应该是移动红色++;到
中的 if 语句if(e.getSource() == rP)
{
if (red < 255)
{
red++;
...
}
}
其他按钮依此类推。
我的第一个问题的解决方案
My JTextFields do not change to 0 if they're outside of the range of (0-255).
我需要在编写 if 语句后将 ActionListener 添加到 JTextFields,如果输入的值不在范围内,则将 JTextFields 设置为 0。
我的第二个问题的解决方案
The JPanel does not change colors based off what is typed in the JTextFields until one of the buttons is clicked.
将 ActionListener 添加到按钮和 JTextFields 后,我创建了一个 if 语句来检查源是按钮还是 JTextFields 以更改背景。