最近,当我按下准备好的地方时,我需要编写一个程序来绘制条形图。有两种情况会画出图形,一种是按表中的位置,另一种是选择区域(如高雄或台北)的打字机 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();
}
}
我曾尝试过很多方法,比如重绘,更新无法解决,当我按表时仍然可以绘图,但是当我按下打字机时无法绘图 我希望有人可以帮助我,谢谢你
答案 0 :(得分:0)
这不是应该如何在Swing中进行绘画。首先来看看Painting in AWT and Swing和Performing Custom Painting,了解有关绘画应该如何完成的详细信息。
基本上,您希望覆盖从paintComponent
(通常首选JComponent
)扩展的组件的JPanel
方法,并执行您想要/需要的自定义绘画在那里表演,记得在你做自定义绘画之前打电话给super.paintComponent
。
避免使用null
布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正