2012-10-12 45 views
0

這是一個任務,很多事情(比如擴展JFrame)都是愚蠢的做事方式,但我必須這樣做。Java GUI通過組合框改變顏色,使用集合和對象array

我創建一個程序,它爲包含在格式創建

white FFFFFF 
yellow FFFF00 

的GUI窗口,有一個色彩組合框和出口按鈕20點的顏色輸入「colours.txt」。組合框中填充了顏色的單詞表示形式,單擊它們時,GUI窗口的背景將更改爲該顏色,使用十六進制值更改顏色,而不是顏色名稱。我必須使用一個集合來實現這一點。我正在重讀所有這些材料,但我真的迷失在一些領域。使用下面的代碼,我可以創建一個窗口並填充組合框,並且如果需要,我可以將顏色名稱打印到控制檯,但是我認爲可以使用的代碼不起作用。這是一個範圍的問題,在這裏我不知道如何設置這使得我可以寫行

frame.setBackground(Color.decode(jcbColour.getSelectedItem().hex)); 

或類似的東西。

package cmis242fp; 

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.util.*; 
import javax.swing.*; 

public class Cmis242fp extends JFrame { 
    private JButton jbtExit = new JButton("Exit"); //action button 
    private static JComboBox jcbColour = new JComboBox(); //drop down of colors 

    public Cmis242fp() { 
     JPanel myPanel = new JPanel(new BorderLayout()); 
     myPanel.add(new JLabel("Select a colour:")); 
     myPanel.add(jcbColour, BorderLayout.CENTER); 
     myPanel.add(jbtExit, BorderLayout.SOUTH); 
     myPanel.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100)); 
     myPanel.setMinimumSize(new Dimension(300,300)); 
     myPanel.setMaximumSize(new Dimension(700,700)); 

     jcbColour.setMaximumSize(new Dimension(30,30)); 
     jcbColour.setMaximumSize(new Dimension(60,60)); 
     add(myPanel); 
     jcbColour.addActionListener(new ComboBoxListener()); 
     jbtExit.addActionListener(new ButtonListener()); 
    } 

    private class ButtonListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.exit(0); 
     } 
    } 

    private class ComboBoxListener implements ActionListener { 
     public void comboAction(Color color) { 
      frame.setBackground(color); 
     } 
     public void actionPerformed(ActionEvent e) { 

      //comboAction(Color.decode(jcbColour.getSelectedItem()); 

     } 
    } 

    public static class Colour implements Comparable<Colour> { 
     private String name; 
     private String hex; 
     public Colour(String name, String hex) { 
      this.name = name; 
      this.hex = hex; 
     } 
     public String ntoString() {return name;} 
     public String htoString() {return hex;} 
     @Override 
     public int compareTo(Colour colour) { 
      return this.name.compareTo(colour.name); 
     } 
     public String toString(){ 
      return name; 
     } 
     public String toHex() { 
      return hex; 
     } 
    } 

    public static void loadColours(String fileName) { 
     java.util.List<Colour> coloursList = new ArrayList<Colour>(); 

     Scanner inFile = null; 
     try { 
      inFile = new Scanner(new File(fileName)); 
      while (inFile.hasNext()) { 
       coloursList.add(new Colour(inFile.next(), inFile.next())); 
      } 
     } 
     catch (Exception other) { 
      System.out.println(other); 
     } 
     finally { 
      if (inFile != null) { 
       inFile.close(); 
      } 
     } 

     for(int x = 0; x < coloursList.size(); x++) { 
      jcbColour.addItem(coloursList.get(x)); 
     } 
    } 

    public static void main(String[] args) { 

     String filename = "colours.txt"; 
     loadColours(filename); 
     Cmis242fp frame = new Cmis242fp(); 
     frame.setSize(350,350); 
     frame.setMinimumSize(new Dimension(300,300)); 
     frame.setMaximumSize(new Dimension(750,750)); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

你的問題是什麼? –

回答

1

如果設置了框架的背景,您將看不到任何區別。最簡單的方法(即不改變太多代碼的)是設置myPanel爲類變量,改變你的聽衆到這一點:

private class ComboBoxListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     myPanel.setBackground(Color.decode(jcbColour.getSelectedItem().toString())); 
    } 
} 

現在,當您選擇組合框的背景也會隨之改變的項目,但請注意,decode方法適用於形式爲#XXXXXX的字符串,因此如果您要使用此技術,則只需將該類型的字符串插入組合框(包括符號)即可。

+0

這幫了很多。我的監聽器最終成爲了myPanel.setBackground(Color.decode(「#」+ coloursList.get(jcbColour.getSelectedIndex())。toHex())); ....相當一口 –

2

嘗試

JFrame.getContentPane().setBackground() 

而且你不需要讓你的組合框的靜態,你可以在你的框架的方法加載的顏色。