2013-11-23 3 views
0

나는 꽃의 꽃잎 만 색을 바꾸고 싶다. 텍스트 필드로 작업 할 수있게되었지만 콤보 박스가 더 좋을 것이라고 결정했습니다 (그래서 강사가 선택할 수있는 색상을 알고 있습니다). 텍스트 필드에 콤보 상자의 선택을 표시하는 몇 가지 예를 보았지만 내 꽃을 사용하는 방법을 잘 모르겠습니다.ComboBox를 사용하여 꽃의 색을 어떻게 변경합니까? (자바)

간단히 말해서, 내 꽃 꽃잎의 색을 변경하는 콤보 박스를 얻는 방법과 배열이 더 좋고 (왜/아닌지)?

사진 - 프레임에 대한 http://s903.photobucket.com/user/Nicole_Pretorius/media/Flowers_zps936f6f40.jpg.html

코드 : 패널에 대한

package Versie4; 


public class FrameFlowers extends javax.swing.JFrame { 


public FrameFlowers() { 
    initComponents(); 
    setSize(900, 600); 
    setContentPane(new PanelFlowers()); 
} 


@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 300, Short.MAX_VALUE) 
    ); 

    pack(); 
}// </editor-fold>       

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(FrameFlowers.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(FrameFlowers.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(FrameFlowers.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(FrameFlowers.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new FrameFlowers().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
// End of variables declaration     
} 

코드 :

그래서 짧은
package Versie4; 
import java.awt.Color; 
import java.awt.Graphics; 

public class PanelFlowers extends javax.swing.JPanel { 
private int amount; 
private String color = ""; 

public PanelFlowers() { 
    initComponents(); 
    repaint(); 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    int teller; 

    g.setColor(Color.RED); //flowerpot 
    g.fillRect(300, 350, 500, 100); 

    int x = 1; 
    for (teller=1; teller <= amount ;teller++) { 

     //Flower 1 
    g.setColor(Color.GREEN); //stem 
    g.fillRect(320 + x, 250, 10, 100); 


     switch (color) {   //Colours of petals 
      case "red": 
       g.setColor(Color.red); 
       break; 
      case "blue": 
       g.setColor(Color.blue); 
       break; 
      case "yellow": 
       g.setColor(Color.yellow); 
       break; 
      case "orange": 
       g.setColor(Color.orange); 
       break; 
      case "pink": 
       g.setColor(Color.PINK); 
       break; 
      case "purple": 
       g.setColor(new Color(102, 0, 204)); 
       break; 
     } 

    g.fillOval(304 + x, 190, 40, 40); //petals 
    g.fillOval(330 + x, 210, 40, 40); 
    g.fillOval(320 + x, 240, 40, 40); 
    g.fillOval(290 + x, 240, 40, 40); 
    g.fillOval(280 + x, 210, 40, 40); 


    g.setColor(Color.YELLOW); //pistil 
    g.fillOval(312 + x, 225, 25, 25); 

    x = teller * 80; 




    } 


} 


@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    lblamount = new javax.swing.JLabel(); 
    txtamount = new javax.swing.JTextField(); 
    lblcolor = new javax.swing.JLabel(); 
    txtcolor = new javax.swing.JTextField(); 
    btngrow = new javax.swing.JButton(); 
    btnreset = new javax.swing.JButton(); 
    colorCombo = new javax.swing.JComboBox(); 

    lblamount.setText("Amount: "); 

    txtamount.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      txtamountActionPerformed(evt); 
     } 
    }); 

    lblcolor.setText("Color: "); 

    txtcolor.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      txtcolorActionPerformed(evt); 
     } 
    }); 

    btngrow.setText("Grow!"); 

    btnreset.setText("Reset Size"); 

    colorCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "red", "blue", "yellow", "orange", "pink", "purple" })); 
    colorCombo.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      colorComboActionPerformed(evt); 
     } 
    }); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addContainerGap() 
        .addComponent(lblamount) 
        .addGap(18, 18, 18) 
        .addComponent(txtamount, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(41, 41, 41) 
        .addComponent(lblcolor) 
        .addGap(18, 18, 18) 
        .addComponent(txtcolor, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(60, 60, 60) 
        .addComponent(btngrow) 
        .addGap(18, 18, 18) 
        .addComponent(btnreset)) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(211, 211, 211) 
        .addComponent(colorCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) 
      .addContainerGap(230, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(lblamount) 
       .addComponent(txtamount, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(lblcolor) 
       .addComponent(txtcolor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(btngrow) 
       .addComponent(btnreset)) 
      .addGap(42, 42, 42) 
      .addComponent(colorCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(350, Short.MAX_VALUE)) 
    ); 
}// </editor-fold>       

private void txtamountActionPerformed(java.awt.event.ActionEvent evt) {           
amount = Integer.parseInt(txtamount.getText()); 

color = this.txtcolor.getText(); 
repaint(); 
}           

private void txtcolorActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
}           

private void colorComboActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
}           

// Variables declaration - do not modify      
private javax.swing.JButton btngrow; 
private javax.swing.JButton btnreset; 
private javax.swing.JComboBox colorCombo; 
private javax.swing.JLabel lblamount; 
private javax.swing.JLabel lblcolor; 
private javax.swing.JTextField txtamount; 
private javax.swing.JTextField txtcolor; 
// End of variables declaration     
} 
+1

이미지에 연결할 수 있습니까? 이해하기가 훨씬 쉬워집니다. =) –

+0

* "..하지만 콤보 상자가 더 좋을 것 같아서 (내 강사가 선택할 수있는 색상을 알고있다.)"진지하게? 내가 강사 였다면 나는 여분의 보너스 포인트를 주려고했다. –

+0

콤보 상자의 문제점은 무엇입니까? 목록이 더 좋을까요? – Nicole

답변

1

, 어떻게의 색상을 변경하려면 콤보 상자를받을 수 있나요 내 꽃잎과 배열이 더 좋을까요?

분명히. JComboBox은 사용자 입력 제어 구성 요소입니다. 유형은 같지만 기호가 다른 여러 항목 중에서 항목을 선택할 수 있습니다. 배열은 구성 요소가 아닙니다. 이것은 항목을 보존 (추가, 저장, 제거)하는 데 사용할 수있는 내부 데이터 구조입니다. 잘 JComboBox는 내부적으로 그러한 데이터 구조를 포함하고 요소를 포함하고 우리를 위해 관리하는 모델 DefaultComboBoxModel을 가지고 있습니다.

그러나, 당신은 아이템 세트에서 항목을 선택하면 때문에 곤경에 당신을 얻을 것이다 JComboBox를 사용하는 방법, 당신은 특정 요소를 찾는 if-else 또는 switch-case 수표를 사용해야합니다. 분명히 당신이 지금하고있는 일이 분명합니다. 간단하지만 (다소 쓸데없는) 해결책은 다음과 같습니다.

public class PanelFlowers extends javax.swing.JPanel { 

    private int amount; 
    // private String color = ""; 
    Color chosenColor; 
    public PanelFlowers() { 
     initComponents(); 
     // repaint(); // <--- no need to call repaint in constructor 
    } 

    private void initComponents() { 

    // your other code------------ 

    DefaultComboBoxModel model = new DefaultComboBoxModel(); 
    model.addElement(new Color(152, 52, 152)); 
    model.addElement(new Color(152, 12, 52)); 
    model.addElement(new Color(152, 142, 120)); 
    colorCombo.setModel(model); 


    colorCombo.addItemListener(new ItemListener() { 


     @Override 
     public void itemStateChanged(ItemEvent e) { 

      JComboBox comb = (JComboBox)e.getSource(); 
      chosenColor = (Color) comb.getSelectedItem(); 
      repaint(); 

     } 
    }); 

나는 위의 해결책을 쓸데없는이라고 불렀습니다. 위의 방법을 사용하여 프로그램을 실행하면 실제로 chosenColor 인스턴스를 사용하여 paintComponent 함수 내부를 그릴 수 있습니다. colorCombo에서 색상을 선택할 때마다 프로그램이 선택한 색상 항목으로 응답하는 것을 확인할 수 있습니다. 하지만 항목은 comboBox에 다음과 같이 표시됩니다 : java.awt.Color[r=xxx,g=xxx,b=xxx] 이것은 아마도 당신이 좋아하지 않을 것입니다.

대략 Color Chooser에 대해 알아보고 사용하십시오.

+0

Err ... 색상 선택기가 매우 귀엽다.이 프로젝트에 대한 지시 사항을 제외하고 모두 내 텍스트 상자 (예 : 코드) 또는 목록을 사용해야한다고 나와 있습니다. 나는 콤보 박스 아이디어를 폐기 하겠지만리스트는 나에게 같은 문제를 줄 것인가? 내 질문이 어리석은 것처럼 보이거나 "분명한 것"이라면 나는 아직도 매우 초보자이므로 사과드립니다. :) – Nicole

+0

귀하의 질문은 제가 초급 (6 개월 전) 때 자신에게 물어 보는 방식보다 훨씬 똑똑합니다.그것에 대해 걱정하지 마십시오. 그러나, 만약 당신이'JList'를 의미한다면리스트에 의해이 경우에는 사용하지 말아야한다. 그리고'List'가'array'를 의미한다면, 실제로 배열이 상호 작용할 수있는 Component가 아니기 때문에 실제로 이해가되지 않습니다. 우리는 데이터를 저장하는 데 사용하지만 그 이상은 사용하지 않습니다. – Sage

+0

정말요? 희망을 갖고 6 개월 만에이 물건들이 나에게 더 의미가있을 것입니다 : P 그리고 예, 나는 JList를 의미했습니다. 이제는 코드를 그대로두고 프로젝트의 나머지 부분을 계속 진행할 것입니다. (부러지지 않은 것을 고치지 마십시오.) 나는 내일까지 또 다른 질문을 할 것입니다. P 감사합니다. 입력! :) – Nicole

관련 문제