面板中的图形闪烁然后消失

时间:2015-10-15 06:19:53

标签: java graphics jpanel

最近,当我按下准备好的地方时,我需要编写一个程序来绘制条形图。有两种情况会画出图形,一种是按表中的位置,另一种是选择区域(如高雄或台北)的打字机 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();
}
}

我曾尝试过很多方法,比如重绘,更新无法解决,当我按表时仍然可以绘图,但是当我按下打字机时无法绘图 我希望有人可以帮助我,谢谢你

1 个答案:

答案 0 :(得分:0)

这不是应该如何在Swing中进行绘画。首先来看看Painting in AWT and SwingPerforming Custom Painting,了解有关绘画应该如何完成的详细信息。

基本上,您希望覆盖从paintComponent(通常首选JComponent)扩展的组件的JPanel方法,并执行您想要/需要的自定义绘画在那里表演,记得在你做自定义绘画之前打电话给super.paintComponent

避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正