Java框架重复而未应用更改



我有两个来自不同类的框架,一个是主框架,只包含一个jbutton和jtextfield,另一个包含一个设置来改变第一帧的背景颜色,所以我有一个问题,因为当我点击按钮OK按钮时,颜色改变了,但它创建了一个新的主框架,而不是在活动的主框架中应用改变。

这里是主框架代码

package com.srccodes.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Cheb extends JFrame implements ActionListener {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cheb cheb = new Cheb();
}
JTextArea about = new JTextArea(3,30);
JButton callB = new JButton("Settings");
Cheb(){
setLayout(new FlowLayout(FlowLayout.CENTER, 20,25));
setSize(400,400);
setTitle("Check Box");

add(new Label("About you"));
JScrollPane aboutScroll= new JScrollPane(about);
add(aboutScroll);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(callB);
setVisible(true);
callB.addActionListener(this);


}

public void actionPerformed(ActionEvent e)
{


//Countinent selection with Check Box
if(e.getSource() == callB)
{
CollorClass cl =new CollorClass();
}


}
}

下面是改变主框架颜色的代码

package com.srccodes.example;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class CollorClass extends JFrame implements ActionListener {
public static void main(String[] args) {
// TODO Auto-generated method stub
CollorClass cc = new CollorClass();
}
JLabel bg = new JLabel("Background Color"); 
String colorName[] = {"None","RED","GREEN","BLACK","BLUE","YELLOW","WHITE"};
JComboBox bgColor = new JComboBox(colorName);
JButton ok = new JButton("OK");
CollorClass()
{
setLayout(new FlowLayout(FlowLayout.CENTER, 20,25));
setSize(400,400);
setTitle("Check Box");
add(bg);
add(bgColor);
add(ok);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
ok.addActionListener(this);

}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

if(e.getSource() == ok)
{
Cheb cheb = new Cheb();
String SelectedValue = bgColor.getSelectedItem().toString();
switch (SelectedValue){
case "RED" :
cheb.about.setBackground(Color.red);
System.out.print(SelectedValue);
break;
case "YELLOW" :
cheb.about.setBackground(Color.yellow);
System.out.print(SelectedValue);
break;
case "BLUE" :
cheb.about.setBackground(Color.blue);
System.out.print(SelectedValue);
break;

case "GREEN" :
cheb.about.setBackground(Color.green);
System.out.print(SelectedValue);
break;
case "BLACK" :
cheb.about.setBackground(Color.black);
System.out.print(SelectedValue);
break;
case "WHITE" :
cheb.about.setBackground(Color.white);
System.out.print(SelectedValue);
break;


default:

System.out.print(SelectedValue);
}
}

}
}

这里的问题是,当您选择颜色时,您正在调用Cheb类的新实例。所以你改变的不是初始窗口的颜色,而是新窗口的颜色。

正是CollorClassactionPerformed方法中的这一行导致了这个问题:

Cheb cheb = new Cheb();

您可能想要做的是将Cheb类作为依赖注入CollorClass。这样,您就可以调用方法并获得初始Cheb类的属性。

这样做的一种方法可能如下(省略号'…点用于隐藏不必要的代码):

CollorClass:

public class CollorClass extends JFrame implements ActionListener {
private final Cheb cheb;
...
CollorClass(Cheb cheb) // important addition
{
this.cheb = cheb; // important addition
setLayout(new FlowLayout(FlowLayout.CENTER, 20,25));
setSize(400,400);
setTitle("Check Box");
add(bg);
add(bgColor);
add(ok);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
ok.addActionListener(this);
}
...

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == ok)
{
// No instantiation of new Cheb here anymore.
// Using the dependency instead.
String SelectedValue = bgColor.getSelectedItem().toString();
switch (SelectedValue){
case "RED" :
cheb.about.setBackground(Color.red);
System.out.print(SelectedValue);
break;
case "YELLOW" :
...
}

、高效:

public class Cheb extends JFrame implements ActionListener {
...
public void actionPerformed(ActionEvent e)
{

//Countinent selection with Check Box
if(e.getSource() == callB)
{
CollorClass cl = new CollorClass(this); // Pass this Cheb instance as argument
}

}

希望这是清楚的。它仍然可以使用改进(例如关闭一个窗口将关闭两个窗口),但这可能是下一个挑战要弄清楚!

最新更新