2015-10-15 27 views
0

最近我需要編寫一個程序來繪製條形圖,當我按下準備好的地方時。有兩種情況會畫圖形,一個是按在桌子的地方,另一種是選擇的區域(如高雄或臺北)在typebox enter image description here面板中的圖形閃過然後消失

但我不知道爲什麼媒體的地方桌子非常清晰,可以在面板上繪製圖形,但是當我按下輸入框時,圖形就會閃爍。下面是我的一些代碼的一部分這個問題

public class Google2 extends JFrame implements ActionListener{ 
JPanel panel;//主要畫布 
Graphics g; 
int regnm=0,regns=0,regna=0,regn=0,regp=0;//生氣數量,傷心數量,憂慮數量,其他數量,正面數量 
String[] stype = { "全部", "基隆", "臺北", "桃園", "新竹", "苗栗", "臺中", "南投", "彰化", "雲林", "嘉義" 
, "臺南", "高雄", "屏東", "臺東", "花蓮", "宜蘭", "外島", "國外"};//所有地區 
JComboBox typebox = new JComboBox(stype);//下拉式印出地區 
DefaultTableModel tmc = new DefaultTableModel(new Object [][] {},new String [] { "Place","count"});//選地點用model 
JTable jt =new JTable(); 
JScrollPane scrollPane = new JScrollPane(jt);//印出負面地點的滾輪 
public Google2(){ 
    setLocation(450,50); 
    setLayout(null); 
    setVisible(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    setSize(1300, 850); 
    typebox.setBounds(125,55,125,30);add(typebox); 
    typebox.addActionListener(this); 
    scrollPane.setBounds(10, 90, 250, 535);add(scrollPane); 
    jt.setModel(tmc);jt.setRowHeight(30); 
    jt.getSelectionModel().addListSelectionListener(//選地點 
    new ListSelectionListener() { 
     public void valueChanged(ListSelectionEvent event) { 
      if(!event.getValueIsAdjusting()){ 
       if(jt.getSelectedRow()>-1){ 
        Draw(); 
       }          
      } 
     } 
    });  
} 
public void actionPerformed(ActionEvent e){ 
    if(e.getSource()==typebox){ 
     Draw(); 
    } 
} 
void Draw(){ 
     g.setColor(WHITE); 
     g.fillRect(0, 0, 379, 329); 
     g.setColor(BLACK); 
     float lineWidth = 6.0f; 
     ((Graphics2D)g).setStroke(new BasicStroke(lineWidth)); 
     g.drawRect(0, 0, 380, 330); 
     g.setFont(font1); 
     g.drawString("生氣", 30, 300); 
     g.drawString("傷心", 100, 300); 
     g.drawString("憂慮", 170, 300); 
     g.drawString("其他", 240, 300); 
     g.drawString("正面", 310, 300); 
     g.setColor(RED); 
     if(regnm>0){ 
      int md=25; 
      md=md*regnm; 
      if(md>250) 
       md=250; 
      g.fillRect(35, 275-md, 35, md); 
     }    
     g.setColor(ORANGE); 
     if(regns>0){ 
      int md=25; 
      md=md*regns; 
      if(md>250) 
       md=250; 
      g.fillRect(105, 275-md, 35, md); 
     } 
     g.setColor(Color.magenta); 
     if(regna>0){ 
      int md=25; 
      md=md*regna; 
      if(md>250) 
       md=250; 
      g.fillRect(175, 275-md, 35, md); 
     } 
     g.setColor(Color.CYAN); 
     if(regn>0){ 
      int md=25; 
      md=md*regn; 
      if(md>250) 
       md=250; 
      g.fillRect(245, 275-md, 35, md); 
     } 
     g.setColor(BLUE); 
     if(regp>0){ 
      int md=25; 
      md=md*regp; 
      if(md>250) 
       md=250; 
      g.fillRect(315, 275-md, 35, md); 
     } 
     regnm=0;regns=0;regna=0;regn=0;regp=0;  
} 
//main function 
public static void main(String[] args) throws Exception{ 
    Google2 gg = new Google2(); 
} 
} 

我試過很多方法,如重繪,更新不能得到解決,仍有可能當我按下表,但無法繪圖時,我按下typebox 被繪製我希望有人能幫助我,謝謝

回答

0

這不是如何在Swing中完成繪畫。首先看看Painting in AWT and SwingPerforming Custom Painting以瞭解更多有關如何完成繪畫的細節。

基本上,要覆蓋從東西延伸像JComponent的一個組成部分的paintComponent方法(JPanel一般是首選),並執行什麼都風俗畫你想/需要在那裏演出,記得打電話super.paintComponent你做你之前自己定製繪畫。

避免使用null佈局,像素完美的佈局是現代UI設計中的幻想。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing旨在與佈局經理一起工作,放棄這些將導致問題和問題的終結,您將花費越來越多的時間嘗試糾正