Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用另一个jFrame更改不同面板的整体颜色_Java_Swing_Jpanel_Background Color - Fatal编程技术网

Java 使用另一个jFrame更改不同面板的整体颜色

Java 使用另一个jFrame更改不同面板的整体颜色,java,swing,jpanel,background-color,Java,Swing,Jpanel,Background Color,因此,我正在开发一个软件,我已经达到了一个特定点,在设置窗口中(将jFrame与主窗口分开),我应该能够使用组合框(称为color_cb1)更改两个不同面板的颜色。 我使用了一个switch语句来获取所选索引,并以其他形式更改颜色,如下所示:[这里给出了整个代码的截图->截图: 但这似乎没有改变任何事情!有人能帮忙吗?我知道你的问题,就在这里: Chatroom c = new Chatroom(); 然后调用方法尝试更改此对象的状态,c.xxx.someMethod();而您的方法实际上

因此,我正在开发一个软件,我已经达到了一个特定点,在设置窗口中(将jFrame与主窗口分开),我应该能够使用组合框(称为color_cb1)更改两个不同面板的颜色。 我使用了一个switch语句来获取所选索引,并以其他形式更改颜色,如下所示:[这里给出了整个代码的截图->截图:


但这似乎没有改变任何事情!有人能帮忙吗?

我知道你的问题,就在这里:

Chatroom c = new Chatroom(); 
然后调用方法尝试更改此对象的状态,
c.xxx.someMethod()
;而您的方法实际上是有效的,它们确实会改变
c
的状态,但是请理解您更改了错误的对象。您的聊天室对象c与实际显示的聊天室不同,更改
c
的状态对显示的对象没有神奇的效果。想象一下你妻子有一辆车,它需要加油。你的上述解决方案类似于你买了一辆品牌、型号和年份完全相同的新车,然后给它加油,然后期望现在你妻子的车有油。不起作用。相反,你需要得到你妻子的车,给它加油,现在一切都好了

一个可能的解决方案是将状态字段设置为静态,这是一个糟糕的解决方案,因为它会导致类失去OOP的好处,使调试变得更困难,增加潜在的复杂性并增加bug的风险

更好的解决方案是将对可视化聊天室对象的引用传递到此类中,并对其调用方法。通过构造函数或setter参数传递引用,您将能够使用它

对于一个MCVE示例,它显示了JDialog的使用以及通过构造函数参数将一个对象的引用传递到另一个对象,请注意下面的程序。在这个程序中,我有两个JPanel,一个MainPanel和一个DialogPanel,一个是应用程序的主JPanel,另一个是JDialog持有的JPanel,当我创建JDialog,我将主面板传递到如下位置:

class MainPanel extends JPanel {
    // ....

    // create the dialog, passing the main panel into it:
    private DialogPanel dialogPanel = new DialogPanel(this);
然后在DialogPanel的构造函数中,我用参数设置了一个字段:

@SuppressWarnings("serial")
class DialogPanel extends JPanel {
    private MainPanel mainPanel;
    // ....

    public DialogPanel(MainPanel mainPanel) {
        this.mainPanel = mainPanel;
然后在对话框面板持有的ActionListener中使用此mainPanel字段:

public void actionPerformed(ActionEvent e) {
    ColorPair colorPair = (ColorPair) colorCombo.getSelectedItem();
    mainPanel.setCenterBackground(colorPair.getColor());
    mainPanel.setSideBackground(colorPair.getDarkColor());
}
另外,由于您使用的是颜色对,因此我创建了一个名为
ColorPair
的枚举,该枚举使用字符串将两种颜色绑定在一起:

public enum ColorPair {
    BLUE("Blue", new Color(52, 73, 94), new Color(44, 62, 80)), 
    GREEN("Green", new Color(46, 204, 113), new Color(39, 174, 96)), 
    TURQ("Turquoise", new Color(26, 188, 156), new Color(22, 160, 133)), 
    GREY("Grey", new Color(149, 165, 166), new Color(127, 140, 141));

    private ColorPair(String text, Color color1, Color color2) {
        this.text = text;
        this.color = color1;
        this.darkColor = color2;
    }

    private String text;
    private Color color;
    private Color darkColor;

    public String getText() {
        return text;
    }
    public Color getColor() {
        return color;
    }
    public Color getDarkColor() {
        return darkColor;
    }
}
为什么要这样做?它帮助我们创建了一个漂亮的效果,我们在JComboBox中渲染两种颜色和文本,让我们可以使用自定义ListCellRenderer类选择颜色:

public class ColorPairRenderer implements ListCellRenderer<ColorPair> {
    private static final int IMG_W = 100;
    private static final int IMG_H = 20;
    private JLabel label = new JLabel();
    private Map<ColorPair, Icon> iconMap = new EnumMap<>(ColorPair.class);

    public ColorPairRenderer() {
        label.setOpaque(true);
        label.setHorizontalTextPosition(SwingConstants.TRAILING);
        label.setVerticalTextPosition(SwingConstants.CENTER);
        for (ColorPair colorPair : ColorPair.values()) {
            BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
            Graphics g = img.getGraphics();
            int x = 0;
            int y = 0;
            int width = IMG_W / 2;
            int height = IMG_H;
            g.setColor(colorPair.getColor());
            g.fillRect(x, y, width, height);

            x = width;
            g.setColor(colorPair.getDarkColor());
            g.fillRect(x, y, width, height);

            x = 0;
            width = IMG_W;
            g.setColor(Color.BLACK);
            g.drawRect(x, y, width, height);
            g.dispose();
            Icon icon = new ImageIcon(img);
            iconMap.put(colorPair, icon);
        }
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends ColorPair> list, ColorPair value, int index,
            boolean isSelected, boolean cellHasFocus) {
        if (value != null) {
            label.setText(value.getText());
            label.setIcon(iconMap.get(value));
        } else {
            label.setText("");
            label.setIcon(null);
        }
        return label;
    }
}
公共类ColorPairRenderer实现ListCellRenderer{
专用静态最终int IMG_W=100;
专用静态最终int IMG_H=20;
专用JLabel标签=新JLabel();
私有映射iconMap=新的枚举映射(ColorPair.class);
公共彩色打印机(){
label.set不透明(true);
label.setHorizontalTextPosition(SwingConstants.training);
label.setVerticalTextPosition(SwingConstants.CENTER);
for(ColorPair ColorPair:ColorPair.values()){
BuffereImage img=新的BuffereImage(img_W,img_H,buffereImage.TYPE_INT_ARGB);
Graphics g=img.getGraphics();
int x=0;
int y=0;
内部宽度=IMG_W/2;
内部高度=内部高度;
g、 setColor(colorPair.getColor());
g、 fillRect(x,y,宽度,高度);
x=宽度;
g、 setColor(colorPair.getDarkColor());
g、 fillRect(x,y,宽度,高度);
x=0;
宽度=IMG_W;
g、 设置颜色(颜色为黑色);
g、 drawRect(x、y、宽度、高度);
g、 处置();
图标图标=新图像图标(img);
iconMap.put(颜色对,图标);
}
}
@凌驾

公共组件GetListCellRenderComponent(JList1)。设置窗口不应该是JFrame,因为它不代表新的应用程序。2.它代表主应用程序的子窗口,因此应该是一个“对话框”窗口,对于Swing,这意味着您应该将其设为JDialog。3.您的问题很简单,“如何更改一个对象与另一个对象的状态",一般的答案是在另一个对象上调用一个方法。你的代码不起作用,这意味着它做了一些错误的事情,可能在错误的实例上调用了一个方法,但是如果没有你的帖子,我们就无法判断问题出在哪里……适当的相关代码,最好是a。我强烈建议你创建其中一个,一个新的单独的程序,一个只想解决你试图解决的问题的程序,一个小到可以把你的问题全部发布在这里的程序,一个为我们编译和运行的程序。4.永远不要将代码作为图像发布。我们不能复制和运行此代码,我们不能修改它,它对我们毫无用处。我编辑了你的问题来显示你的图像,以添加一个Swing标记并删除JavaScript标记,因为您的问题与此语言无关。如果您对上述评论有任何疑问,请告诉我,并注意,您越快显示您的评论,您就越快越好得到一个合适的答案。请参阅发布代码的更新。请回复。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.EnumMap;
import java.util.Map;
import javax.swing.*;

public class ChangeColor {
    private static void createAndShowGui() {
        MainPanel mainPanel = new MainPanel();

        JFrame frame = new JFrame("Change Color");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class MainPanel extends JPanel {
    private JPanel centerPanel = new JPanel();
    private JPanel sidePanel = new JPanel();

    // create the dialog, passing the main panel into it:
    private DialogPanel dialogPanel = new DialogPanel(this);
    private JDialog dialog;

    public MainPanel() {
        centerPanel.setPreferredSize(new Dimension(400, 400));
        sidePanel.setPreferredSize(new Dimension(100, 400));
        setLayout(new BorderLayout());
        add(centerPanel, BorderLayout.CENTER);
        add(sidePanel, BorderLayout.LINE_END);

        centerPanel.add(new JButton(new ShowColorDialogAction("Change Colors")));
    }

    public void setCenterBackground(Color c) {
        centerPanel.setBackground(c);
    }

    public void setSideBackground(Color c) {
        sidePanel.setBackground(c);
    }

    private class ShowColorDialogAction extends AbstractAction {
        public ShowColorDialogAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (dialog == null) {                
                Window frame = SwingUtilities.getWindowAncestor(MainPanel.this);
                dialog = new JDialog(frame, "Color Setter", ModalityType.MODELESS);
                dialog.getContentPane().add(dialogPanel);
                dialog.pack();
                dialog.setLocationByPlatform(true);
            }
            dialog.setVisible(true);
        }
    }
}

@SuppressWarnings("serial")
class DialogPanel extends JPanel {
    private MainPanel mainPanel;
    private JComboBox<ColorPair> colorCombo = new JComboBox<>(ColorPair.values());

    public DialogPanel(MainPanel mainPanel) {
        this.mainPanel = mainPanel;
        colorCombo.setSelectedIndex(-1);
        colorCombo.setRenderer(new ColorPairRenderer());
        colorCombo.addActionListener(new ColorComboListener());
        add(colorCombo);
    }

    private class ColorComboListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            ColorPair colorPair = (ColorPair) colorCombo.getSelectedItem();
            mainPanel.setCenterBackground(colorPair.getColor());
            mainPanel.setSideBackground(colorPair.getDarkColor());
        }
    }
}

class ColorPairRenderer implements ListCellRenderer<ColorPair> {
    private static final int IMG_W = 100;
    private static final int IMG_H = 20;
    private JLabel label = new JLabel();
    private Map<ColorPair, Icon> iconMap = new EnumMap<>(ColorPair.class);

    public ColorPairRenderer() {
        label.setOpaque(true);
        label.setHorizontalTextPosition(SwingConstants.TRAILING);
        label.setVerticalTextPosition(SwingConstants.CENTER);
        for (ColorPair colorPair : ColorPair.values()) {
            BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
            Graphics g = img.getGraphics();
            int x = 0;
            int y = 0;
            int width = IMG_W / 2;
            int height = IMG_H;
            g.setColor(colorPair.getColor());
            g.fillRect(x, y, width, height);

            x = width;
            g.setColor(colorPair.getDarkColor());
            g.fillRect(x, y, width, height);

            x = 0;
            width = IMG_W;
            g.setColor(Color.BLACK);
            g.drawRect(x, y, width, height);
            g.dispose();
            Icon icon = new ImageIcon(img);
            iconMap.put(colorPair, icon);
        }
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends ColorPair> list, ColorPair value, int index,
            boolean isSelected, boolean cellHasFocus) {
        if (value != null) {
            label.setText(value.getText());
            label.setIcon(iconMap.get(value));
        } else {
            label.setText("");
            label.setIcon(null);
        }

        if (isSelected) {
            label.setBackground(Color.LIGHT_GRAY);
        } else {
            label.setBackground(null);
        }
        return label;
    }
}

enum ColorPair {
    BLUE("Blue", new Color(52, 73, 94), new Color(44, 62, 80)), 
    GREEN("Green", new Color(46, 204, 113), new Color(39, 174, 96)),
    TURQ("Turquoise", new Color(26, 188, 156), new Color(22, 160, 133)), 
    RED("Red", new Color(204, 46, 113), new Color(174, 39, 96)),
    YELLOW("Yellow", new Color(204, 204, 46), new Color(174, 174, 39)),
    Violet("Violet", new Color(204, 46, 204), new Color(174, 39, 174)),
    GREY("Grey", new Color(149, 165, 166), new Color(127, 140, 141));

    private ColorPair(String text, Color color1, Color color2) {
        this.text = text;
        this.color = color1;
        this.darkColor = color2;
    }

    private String text;
    private Color color;
    private Color darkColor;

    public String getText() {
        return text;
    }
    public Color getColor() {
        return color;
    }
    public Color getDarkColor() {
        return darkColor;
    }
}