2017-07-06 32 views
-2

所以我正在一个软件上工作,我已经达到了设置窗口中的某个位置(与主体分开的jFrame),我应该能够改变两个颜色不同的面板使用ComboBox(称为Color_cb1)。 我用switch语句来获得所选择的指数和改变颜色的其他形式,像这样:这里给出的整个代码的截图 - >截图:使用另一个jFrame改变不同面板的整体颜色

enter image description here

,但它只是没有按” t似乎改变了一切!有人可以帮忙吗?

+0

1 。设置窗口不应该是JFra因为它不代表新的应用程序。 2.它代表主应用程序的一个子窗口,所以应该是一个“对话框”窗口,对于Swing来说意味着你应该把它变成一个JDialog。 3.你的问题简而言之,“我怎样才能从另一个对象中改变一个对象的状态”,一般的答案是在另一个对象上调用一个方法。你的代码不起作用,这意味着它做错了什么,或许是在错误的实例上调用了方法,但是没有你的发布,我们不可能知道问题是什么...... –

+0

....不错的相关代码,最好是[MCVE]。我强烈建议你创建其中的一个,一个新的独立程序,一个只尝试去解决你正在尝试解决的问题,而另一个程序足够小,可以在这里完整地发布你的问题,一个编译并为我们运行。 –

+0

4. ***不要***将代码作为图像发布。我们无法复制和运行此代码,我们无法修改它,这对我们毫无用处。 –

回答

1

我看到你的问题,它在这里:

Chatroom c = new Chatroom(); 

你然后调用方法来试图改变这个对象,c.xxx.someMethod()的状态;而你的方法其实工作,他们确实改变了c的状态,但是请理解你的改了这个对象。您的聊天室对象c与实际显示的聊天室不同,并且更改c的状态将不会对所显示的对象产生不可思议的影响。想象一下,想象你的妻子有一辆车,而且它需要汽油。您的上述解决方案与您购买完全相同品牌,型号和年份的新车类似,然后填充汽油,并期望现在您的妻子的汽车有汽油。不起作用。相反,你需要拿着你妻子的车,用天然气填充,现在事情很好。

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

更好的解决方案是将参考传递给可视化的Chatroom对象到这个类中,并调用它的方法。通过构造函数或setter参数传递引用,您就可以使用它。

有关显示使用JDialog以及通过构造函数参数将一个对象的引用传递给另一个对象的MCVE的示例,请注意以下程序。在这个程序中,我有两个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; 
    } 
} 


要看到整个事情在行动中,复制和粘贴下面的代码到你的IDE到一个名为ChangeColor.java类文件,并运行它(更新以显示它是多么容易增加新的颜色 - 一行代码):

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; 
    } 
}