2012-11-17 40 views
1

我有滑塊可以創建RGB值,然後用它創建一個框並填充它的顏色。當我初始化我的程序時,它不會立即畫出正方形。它將繪製正方形,並在移動滑塊後開始填充它。表格加載時的Java GUI繪製和填充矩形

用於繪製矩形並填充顏色的方法在構造函數中被調用,但不做任何事情,沒有錯誤,只是不繪製正方形。滑塊在狀態改變時調用SAME方法,然後它將繪製正方形。這個不成立。

我確定這是其他人可能會遇到的缺乏某些基礎。

這裏是我的代碼,你可以複製粘貼並運行在jGrasp或任何看到我的意思。謝謝!

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Colors extends javax.swing.JFrame { 

    public Colors() { 
     initComponents(); 
     addSliderListeners(); 
     addSliderLabels(); 
     this.setTitle("Color Mixer"); 
     sliderRed.setValue(150); 
     sliderGreen.setValue(125); 
     sliderBlue.setValue(215); 
     updateImage(); 
    } 

    private void addSliderListeners(){ 
     sliderRed.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       updateImage(); 
      } 
     }); 
     sliderGreen.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       updateImage(); 
      } 
     }); 
     sliderBlue.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       updateImage(); 
      } 
     }); 
    } 

    private void updateImage(){ 
     lblRedDec.setText(""+sliderRed.getValue()); 
     lblRedDec.setForeground(new Color(sliderRed.getValue(),0,0)); 
     lblRedHex.setText(Integer.toHexString(sliderRed.getValue())); 
     lblRedHex.setForeground(lblRedDec.getForeground()); 

     lblGreenDec.setText(""+sliderGreen.getValue()); 
     lblGreenDec.setForeground(new Color(0,sliderGreen.getValue(),0)); 
     lblGreenHex.setText(Integer.toHexString(sliderGreen.getValue())); 
     lblGreenHex.setForeground(lblGreenDec.getForeground()); 

     lblBlueDec.setText(""+sliderBlue.getValue()); 
     lblBlueHex.setText(Integer.toHexString(sliderBlue.getValue())); 
     lblBlueDec.setForeground(new Color(0,0,sliderBlue.getValue())); 
     lblBlueHex.setForeground(lblBlueDec.getForeground()); 

     Graphics2D g2 = (Graphics2D)this.getGraphics(); 
     g2.setColor(new Color(sliderRed.getValue(),sliderGreen.getValue(),sliderBlue.getValue())); 
     g2.fill(new Rectangle(25,125,250,250)); 
    } 

    private void addSliderLabels() { 
     sliderRed.setPaintLabels(true); 
     sliderGreen.setPaintLabels(true); 
     sliderBlue.setPaintLabels(true); 
    } 
/** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     sliderRed = new javax.swing.JSlider(); 
     lblRed = new javax.swing.JLabel(); 
     lblRedHex = new javax.swing.JLabel(); 
     lblRedDec = new javax.swing.JLabel(); 
     sliderGreen = new javax.swing.JSlider(); 
     lblGreen = new javax.swing.JLabel(); 
     lblGreenHex = new javax.swing.JLabel(); 
     lblGreenDec = new javax.swing.JLabel(); 
     sliderBlue = new javax.swing.JSlider(); 
     lblBlue = new javax.swing.JLabel(); 
     lblBlueHex = new javax.swing.JLabel(); 
     lblBlueDec = new javax.swing.JLabel(); 
     lblTitle = new java.awt.Label(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setResizable(false); 

     sliderRed.setMajorTickSpacing(15); 
     sliderRed.setMaximum(255); 
     sliderRed.setMinorTickSpacing(5); 
     sliderRed.setOrientation(javax.swing.JSlider.VERTICAL); 
     sliderRed.setPaintTicks(true); 
     sliderRed.setValue(212); 
     sliderRed.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 
     sliderRed.setName(""); // NOI18N 

     lblRed.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N 
     lblRed.setText("Red"); 

     lblRedHex.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblRedHex.setText("hex"); 

     lblRedDec.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblRedDec.setText("dec"); 

     sliderGreen.setMajorTickSpacing(15); 
     sliderGreen.setMaximum(255); 
     sliderGreen.setMinorTickSpacing(5); 
     sliderGreen.setOrientation(javax.swing.JSlider.VERTICAL); 
     sliderGreen.setPaintTicks(true); 
     sliderGreen.setSnapToTicks(true); 
     sliderGreen.setValue(35); 
     sliderGreen.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 
     sliderGreen.setName(""); // NOI18N 

     lblGreen.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N 
     lblGreen.setText("Green"); 

     lblGreenHex.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblGreenHex.setText("hex"); 

     lblGreenDec.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblGreenDec.setText("dec"); 

     sliderBlue.setMajorTickSpacing(15); 
     sliderBlue.setMaximum(255); 
     sliderBlue.setMinorTickSpacing(5); 
     sliderBlue.setOrientation(javax.swing.JSlider.VERTICAL); 
     sliderBlue.setPaintTicks(true); 
     sliderBlue.setSnapToTicks(true); 
     sliderBlue.setValue(218); 
     sliderBlue.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 
     sliderBlue.setName(""); // NOI18N 

     lblBlue.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N 
     lblBlue.setText("Blue"); 

     lblBlueHex.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblBlueHex.setText("hex"); 

     lblBlueDec.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     lblBlueDec.setText("dec"); 

     lblTitle.setFont(new java.awt.Font("Dialog", 0, 36)); // NOI18N 
     lblTitle.setText("Color Mixer"); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(lblTitle, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 125, Short.MAX_VALUE) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(27, 27, 27) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(lblRedHex) 
          .addComponent(lblRed) 
          .addComponent(lblRedDec)) 
         .addGap(25, 25, 25)) 
        .addComponent(sliderRed, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(sliderGreen, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(lblGreenHex) 
          .addComponent(lblGreen) 
          .addComponent(lblGreenDec)) 
         .addGap(25, 25, 25))) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(sliderBlue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(lblBlueHex) 
          .addComponent(lblBlue) 
          .addComponent(lblBlueDec)) 
         .addGap(25, 25, 25)))) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(23, Short.MAX_VALUE) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
         .addGroup(layout.createSequentialGroup() 
          .addComponent(lblBlueDec) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(lblBlueHex) 
          .addGap(18, 18, 18) 
          .addComponent(lblBlue) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(sliderBlue, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGroup(layout.createSequentialGroup() 
          .addComponent(lblGreenDec) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(lblGreenHex) 
          .addGap(18, 18, 18) 
          .addComponent(lblGreen) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(sliderGreen, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGroup(layout.createSequentialGroup() 
          .addComponent(lblRedDec) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(lblRedHex) 
          .addGap(16, 16, 16) 
          .addComponent(lblRed) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
          .addComponent(sliderRed, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE))) 
        .addComponent(lblTitle, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(38, 38, 38)) 
     ); 

     lblTitle.getAccessibleContext().setAccessibleName(""); 
     lblTitle.getAccessibleContext().setAccessibleDescription(""); 

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


    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(Colors.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(Colors.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(Colors.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(Colors.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 Colors().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JLabel lblBlue; 
    private javax.swing.JLabel lblBlueDec; 
    private javax.swing.JLabel lblBlueHex; 
    private javax.swing.JLabel lblGreen; 
    private javax.swing.JLabel lblGreenDec; 
    private javax.swing.JLabel lblGreenHex; 
    private javax.swing.JLabel lblRed; 
    private javax.swing.JLabel lblRedDec; 
    private javax.swing.JLabel lblRedHex; 
    private java.awt.Label lblTitle; 
    private javax.swing.JSlider sliderBlue; 
    private javax.swing.JSlider sliderGreen; 
    private javax.swing.JSlider sliderRed; 
    // End of variables declaration     

} 
+0

只是猜測這裏。也許現在在構造函數中改變顏色還爲時過早。你應該測試看看'this.getGraphics()'返回什麼。還要注意這一點:'new Colors()。setVisible(true)'。你實例化'JFrame',然後你才叫'setVisible'。 –

+0

@JamesPoulson:該代碼是由NetBeans自動生成的。但是,我不確定這會如何影響顯示。 – Kairan

+0

是的,我注意到底部的變量聲明。我的想法是,當調用'setVisible'時,JFrame使用的畫布可能會重置或刷新。你應該檢查它是如何工作的。 –

回答

2

的原因,顏色方塊最初不露面是因爲這樣的事實:GroupLayout導致所有的子組件的重繪其有效地「描繪了」廣場。

爲了讓您的廣場上顯示你既可以:

  • 創建自定義JComponent顏色方塊&添加到GroupLayout
  • 將所有當前組件提取到新的JComponent並覆蓋paintComponent方法,以便首先繪製所有GroupLayout組件。該選項允許您不要將顏色方塊添加到GroupLayout

代碼:

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    updateImage(); 
} 
+0

「顏色方塊最初沒有出現的原因是由於GroupLayout會重新繪製其所有有效地」覆蓋「方塊的子組件。」 你是怎麼弄出來的:p? –

+1

將應用程序和提取出來的'paintComponent'運行完美。在知道它的行爲之前,先使用這個佈局。 – Reimeus

+0

@Reimeus:我插入它沒有結果,你能告訴我代碼的目的地是在哪裏? – Kairan