2014-10-10 22 views
1

我想寫一個類的程序,我卡住了。我需要創建一個形狀(我的初始),然後用它填充它JColorChooser。我已經能夠創建我最初使用的油漆和圖形。然後我可以使用g.setColor(new Color(11,139,198))填充我的形狀;我不知道如何爲此添加JColorChooser。這是我的第一篇文章,所以讓我知道我可以做些什麼來使它更容易閱讀。 這裏是我的代碼:paintComponent()和JColorChooser

/* Program - Letter 
* Program Desc - 
* Programmer - Bradon Fredrickson 
* Class - 
* Created - Oct 1, 2014 
*/ 
package letter; 

import java.awt.Container; 
import java.awt.GridLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Letter 
{ 

    public static void PlainLetter() 
    { 
     /* 
     * Creating GUI for letter 
     */ 
     LetterDraw plainLetter = new LetterDraw(); 
     JFrame logo = new JFrame("My Logos"); 
     JLabel plain = new JLabel("Plain Letter"); 
     plain.setLocation(10, 0); 
     plain.add(plainLetter); 
     Container pane = logo.getContentPane(); 
     pane.setLayout(new GridLayout(1, 1)); 
     logo.setLocationRelativeTo(null); // Center the frame 
     logo.add(plainLetter); 
     logo.setVisible(true); 
     logo.setSize(400, 200); 
     logo.setLocation(400, 200); 
     logo.setVisible(true); 
     logo.setDefaultCloseOperation(logo.EXIT_ON_CLOSE); 
    }//end plain letter 

    public static void main(String[] args) 
    { 
     PlainLetter(); 
     new ColorChooser(); 
    }//end main method 
}//end Letter 

第二類 - 這是拉我的對象

/* Program - ThirdLetter 
* Program Desc - 
* Programmer - Bradon Fredrickson 
* Class - 
* Created - Oct 6, 2014 
*/ 

package letter; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Path2D; 
import javax.swing.JPanel; 

public class LetterDraw extends JPanel 
{ 

    /* 
    * Creating my shape/letter 
    */ 
    public void paint(Graphics graphics) 
    { 

     Path2D.Double path = new Path2D.Double(); 
     Graphics2D g = (Graphics2D) graphics; 
     path.moveTo(17, 63); 
     /* 
     * Top Horizontal Line 
     */ 
     path.curveTo(21, 60, 21, 43, 17, 37); //left vert 
     path.curveTo(30, 43, 100, 43, 120, 37); //top horiz 
     path.curveTo(115, 45, 115, 57, 117, 62); //right vert 
     path.curveTo(105, 53, 60, 57, 17, 63); //bottom horiz right 
     /* 
     * Bottom Horizontal Line 
     */ 
     path.moveTo(32, 97); 
     path.curveTo(37, 85, 35, 79, 35, 77); //left vert 
     path.curveTo(45, 79, 45, 79, 100, 79); //top left horiz 
     path.curveTo(96, 85, 98, 92, 98, 98);//right vert 
     path.curveTo(89, 93, 79, 94, 32, 97);//bottom right horiz 
     /* 
     * Vertical Line 
     */ 
     path.moveTo(40, 130); 
     path.curveTo(48, 110, 46, 70, 37, 55); //left vert 
     path.curveTo(62, 55, 62, 55, 60, 55); //top horiz 
     path.curveTo(68, 80, 68, 100, 63, 130); //right vert 
     path.curveTo(60, 127, 50, 127, 40, 130);//bottom horiz 
     g.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g.setStroke(new BasicStroke(3)); 
     //g.setStroke(new BasicStroke(4, BasicStroke.JOIN_BEVEL, 0)); 
     g.draw(path); 
     g.setColor(new Color(11, 139, 198)); 
     g.fill(path); 
    }//end paint 
}//end LetterDraw 

第三 - 這是我的colorChooser

/* Program - ColorChooser 
* Program Desc - 
* Programmer - Bradon Fredrickson 
* Class - 
* Created - Oct 10, 2014 
*/ 
package letter; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.colorchooser.ColorSelectionModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class ColorChooser 
{ 

    /** 
    * Creating the color chooser 
    */ 
    public ColorChooser() 
    { 
     JFrame frame = new JFrame("JColorChooser Popup"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JLabel label = new JLabel("www.java2s.com", JLabel.CENTER); 
     label.setFont(new Font("Serif", Font.BOLD | Font.ITALIC, 48)); 

     frame.add(label, BorderLayout.NORTH); 

     final JColorChooser colorChooser = new JColorChooser(label. 
       getBackground()); 

     ColorSelectionModel model = colorChooser.getSelectionModel(); 
     ChangeListener changeListener = new ChangeListener() 
     { 
      public void stateChanged(ChangeEvent changeEvent) 
      { 
       Color newForegroundColor = colorChooser.getColor(); 
       label.setForeground(newForegroundColor); 
      } 
     }; 
     model.addChangeListener(changeListener); 

     frame.add(colorChooser, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setVisible(true); 
    }//end colorChooser 
}//end colorChooser class 

現在,我得到2個JFrames 1我的形狀和JColorChooser的1。我想把它們全部放在1個框架中。

+2

「Swing程序應該重寫'的paintComponent()',而不是覆蓋'的paint()'。」 - [*繪畫在AWT和Swing:該漆方法*](HTTP:/ /www.oracle.com/technetwork/java/painting-140037.html#callbacks)。 – trashgod 2014-10-10 14:01:14

回答

3

在你LetterDraw類,而不是做

g.setColor(new Color(11, 139, 198)); 

最好有一類成員Color color,並且有一個二傳手它。那麼就只是這樣做

public class LetterDraw extends JPanel { 
    private Color color = Color.BLUE; // default; 

    public void setColor(Color color) { 
     this.color = color; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     ... 
     g.setColor(color); 
    } 
} 

通知的paintComponentsuper.paintComponent。請參閱評論中的@trashgod鏈接。

至於顏色選擇,JColorChooser有一個靜態方法,您可以調用該方法來顯示顏色選擇器對話框並從中獲取返回的顏色。然後,您可以使用該顏色在LetterDraw上撥打setColor。不需要創建自己的框架。例如。

Color color = JColorChooser.showDialog(null, "title", Color.BLUE); 
letterDraw.setColor(color); 

如果你想保持顏色選擇框打開,但並擁有,使用當前的代碼,你會需要或者使用某種MVC/Observer設計的,或者LetterDraw的實例傳遞給ColorChooser構造函數,這樣它就可以調用LetterDraw's設置顏色方法,改變顏色後。

「我希望把他們都在1幀也是」

我只注意到這個問題的一部分。

您可能會忘記ColorChooser課程,並在Letter課程中創建JColorChooser。因此您可以訪問LetterDraw對象。這裏有一個重構的可能外觀

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.RenderingHints; 
import java.awt.geom.Path2D; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Letter { 

    LetterDraw letterDraw = new LetterDraw(); 

    public Letter() { 
     JFrame frame = new JFrame(); 
     JPanel letterDrawWrapper = new JPanel(new GridBagLayout()); 
     letterDrawWrapper.add(letterDraw); 
     frame.add(letterDrawWrapper); 
     frame.add(createColorChooser(), BorderLayout.PAGE_END); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JColorChooser createColorChooser() { 
     JColorChooser colorChooser = new JColorChooser(); 
     colorChooser.getSelectionModel().addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       letterDraw.setColor(colorChooser.getColor()); 
      } 
     }); 
     return colorChooser; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Letter(); 
      } 
     }); 
    } 
} 

class LetterDraw extends JPanel { 

    private Color color; 

    public void setColor(Color color) { 
     this.color = color; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics graphics) { 
     super.paintComponent(graphics); 
     Path2D.Double path = new Path2D.Double(); 
     Graphics2D g = (Graphics2D) graphics; 
     path.moveTo(17, 63); 
     /* 
     * Top Horizontal Line 
     */ 
     path.curveTo(21, 60, 21, 43, 17, 37); //left vert 
     path.curveTo(30, 43, 100, 43, 120, 37); //top horiz 
     path.curveTo(115, 45, 115, 57, 117, 62); //right vert 
     path.curveTo(105, 53, 60, 57, 17, 63); //bottom horiz right 
      /* 
     * Bottom Horizontal Line 
     */ 
     path.moveTo(32, 97); 
     path.curveTo(37, 85, 35, 79, 35, 77); //left vert 
     path.curveTo(45, 79, 45, 79, 100, 79); //top left horiz 
     path.curveTo(96, 85, 98, 92, 98, 98);//right vert 
     path.curveTo(89, 93, 79, 94, 32, 97);//bottom right horiz 
      /* 
     * Vertical Line 
     */ 
     path.moveTo(40, 130); 
     path.curveTo(48, 110, 46, 70, 37, 55); //left vert 
     path.curveTo(62, 55, 62, 55, 60, 55); //top horiz 
     path.curveTo(68, 80, 68, 100, 63, 130); //right vert 
     path.curveTo(60, 127, 50, 127, 40, 130);//bottom horiz 
     g.setRenderingHint(
       RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g.setStroke(new BasicStroke(3)); 
     //g.setStroke(new BasicStroke(4, BasicStroke.JOIN_BEVEL, 0)); 
     g.draw(path); 
     g.setColor(color); 
     g.fill(path); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(150, 150); 
    } 
} 
+0

感謝您的回覆。今天晚些時候我會嘗試一下,但看起來這就是我需要的!謝謝! – 2014-10-10 15:37:26

+0

對不起,對這個問題的回覆遲了,忙了一個週末,剛開始更新我的代碼。非常感謝你,這正是我所需要的。我一直在努力幾天,我越來越近,但我不知道我是否會想出來。我試圖理解你所做的一切。Dimension getPrefferedSize()方法究竟做了什麼?那是你如何讓我的形狀集中在JFrame的頂部? – 2014-10-13 02:35:33

+0

'getPreferredSize()'給面板一個'preferredSize'。一些佈局管理器將使用這個preferredSize來設置面板的大小。 JFrame有一個默認的'BorderLayout',它不關心preferredSize。它將拉伸面板以適應。不是我用另一個面板包裹你的繪圖面板,而是使用'GridBagLayout',它確實遵守preferredSize。如果我沒有設置preferredSize並且沒有包裹面板,面板將被拉伸到框架的邊緣,並且x,y座標將導致繪圖朝向左上方 – 2014-10-13 02:40:46