如何在按下按钮时使用repaint()方法并且Graphics p必须从头开始重新绘制所有内容?
感谢。
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class fares extends JPanel{
private static final long serialVersionUID = 1L;
public static int xaxis1,xaxis2,yaxis3,yaxis4;
public ControlsB(square) {
final JButton btn1 = new JButton("Resize");
final Box b = Box.createHorizontalBox();
b.add(new JLabel("Please enter range: "));
Box b0 = Box.createVerticalBox();//create a vertical box to stack the controls
Box b1 = Box.createHorizontalBox(); // create a horizontal box for the x-axis
//x-axis
b1.add(new JLabel("mark "));
b1.add(new JLabel("for"));
f1.setMaximumSize(new Dimension(100,30));
b1.add(f1);
b1.add(new JLabel("till"));
f2.setMaximumSize(new Dimension(100,30));
b1.add(f2);
//y-axis
//this code is not in use at the moment
f4.setMaximumSize(new Dimension(100,30));
b2.add(f4);
b0.add(b1);
add(b);
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
f = Integer.parseInt(f1.getText());
invalidate();
validate();
paint(p);//this is not working...
}
});
b.add(btn1);
}
}
这是必须调用并重新绘制的代码:
import java.awt.*;
import javax.swing.*;
class Graph extends JPanel {
public static Graphics p;
private static final long serialVersionUID = 1L;
public static int f;
public static int g;
@Override
public Dimension getPreferredSize()
{
return (new Dimension(560,560));
}
public void paintComponent(Graphics p) {
super.paintComponent(p);
Graphics2D graph = (Graphics2D)p;
Dimension appletSize = this.getSize();
int appletHeight = (int)(appletSize.height);
int appletWidth = appletSize.width;
//change -ve num to +ve
int g3 = Math.abs(g);
int a1 = g3 + f;
int b1 = a1;
int d = (appletWidth / a1);
int e = (appletHeight / b1);
//draw y-axis numbers
//(+ve)
while(f != 0){
String s = String.valueOf(f);
m = m + b;
f = f - 1;
}
//(-ve)
m2 = y;
while(f2 != g-1)
m2 = m2 + b;
f2 = f2 - 1;
}
//draw x-axis numbers.
//(-ve)
while(g != 0){
String hy = String.valueOf(g);
n = n + a;
g = g + 1;
}
//(+ve)
n2 = x + a;
while(g2 != g3+1){
String w = String.valueOf(g2);
n2 = n2 + a;
g2 = g2 + 1;
}
BasicStroke aLine2 = new BasicStroke(1.0F,
BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
graph.setStroke(aLine2);
//notch on numbers and grid lines
//left to right, top to bottom notches
int v2 = -5;
int v5 = 0;
while(i <= a1-1){
p.setColor(Color.lightGray);//lightgray line
a = a + d;
b = b + e;
i = i + 1;
}
}
}
当调整大小按钮工作时,我需要调整窗口大小以使图形响应给定的输入。基本上,当重新调整图形的大小/重新绘制时...现在我需要自动完成。
答案 0 :(得分:6)
基于代码片段很难分辨出什么是错误的,但看起来您的图形是在Graph对象上绘制的,称为图形(如果我错了请纠正我),并且您似乎正在尝试重新绘制(或油漆 - 永远不要直接调用!)您的ControlsB面板。如果是这样,那么您可能正在调用错误对象上的方法。也许你需要做一些事情:
// graph is final so it may be used in an inner class
public ControlsB(Box box2, final Graph graph) {
// .....
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
f = Integer.parseInt(f1.getText());
g = Integer.parseInt(f2.getText());
System.out.println(f + " " + g);
// invalidate();
// validate();
// paint(p); ***** NEVER do this
graph.repaint();
}
});
}
此外:
paint(...)
。答案 1 :(得分:5)
所做的更改:
GraphApplet
类中,这两行已更改Box box2 = new Box(BoxLayout.Y_AXIS); // Changed
// Added one more argument, while making Object.
ControlsB b = new ControlsB(box2, graph);//horizontal
setValues(...)
方法。 -
public void setValues(int x, int y)
{
xstart = x;
ystart = y;
repaint();
}
Graph
类内,变量范围xstart
和ystart
具有
已更改为Instance/Class
refineButton = new JButton("Refine");
buttonBox.add(refineButton);
refineButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
int x = Integer.parseInt(f1.getText());
int y = Integer.parseInt(f3.getText());
/*
* Calling a method of Graph Class (setValues)
* and passing the values that we had got from
* the respective JTextFields.
*/
graph.setValues(x, y); }
});
}
在这里观看这段代码示例,稍微修改了您之前的示例,以便您了解如何使其工作。看看附加的图像,只使用这三个东西,在指向JTextField
s中输入一些整数值,然后点击Refine JButton
,你会看到如何重绘。由于我真的不知道逻辑是如何工作的,因此无法说出如何优化代码,虽然给你一个想法,这里是:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class GraphApplet extends JApplet
{
private static final long serialVersionUID = 1L;
public void init(){
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Container conn = getContentPane();
conn.setLayout(new BorderLayout());
Graph graph = new Graph();//graph
conn.add(graph,BorderLayout.CENTER);
Box box1 = new Box(BoxLayout.X_AXIS);
ControlsA a = new ControlsA(box1);//vertical
conn.add(a,BorderLayout.EAST);
Box box2 = new Box(BoxLayout.Y_AXIS); // Changed
// Added one more argument, while making Object.
ControlsB b = new ControlsB(box2, graph);//horizontal
conn.add(b,BorderLayout.SOUTH);
}
});
}
}
class Graph extends JPanel {
private static final long serialVersionUID = 1L;
private int xstart;
private int ystart;
public Graph(){
this.setBackground(Color.yellow);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(460,560));
}
/*
* Added this method, which will call
* repaint(), everytime it is been
* called from anywhere. Moreover
* the variables used inside
* paintComponent(...) method xstart
* and ystart, have been changed to
* instance variables of the Graph Class.
*/
public void setValues(int x, int y)
{
xstart = x;
ystart = y;
repaint();
}
@Override
public void paintComponent(Graphics p)
{
super.paintComponent(p);
Graphics2D graph = (Graphics2D)p;
Dimension appletSize = this.getSize();
int appletHeight = (int)(appletSize.height);
int appletWidth = appletSize.width;
this.setBackground(Color.yellow);//set background color.
int x,y,y1,x1,a,b,p1x,p1y,p2x,p2y;
//line co-ordinates
//the numbers represent the number of boxes on the graph
// Made these two variables as Instance Variables
//int xstart = 10;
//int ystart = 5;
int xfinish = 2;
int yfinish = 8;
//other variables
int i = 0;
int i2 = 0;
int m = 0;
int n = 0;
int m2 = 0;
int n2 = 0;
int f2 = 0;
int g2 = 1;
//ranges
int f = 5;
int g = -5;
//change -ve num to +ve
int g3 = Math.abs(g);
int a1 = g3 + f;
int b1 = a1;
y1 = (appletHeight);
x1 = (appletWidth);
y = (appletHeight / 2);
x = (appletWidth / 2);
a = (appletWidth / a1);
b = (appletHeight / b1);
int d = (appletWidth / a1);
int e = (appletHeight / b1);
/**
to determine the
ammount of pixles there
is in each box of the
graph, both y-axis and
x-axis
*/
int xbox = x1 / 10;
int ybox = y1 / 10;
//line variables
//the xstart, ystart, etc represent the number of boxes
//top point of the line on the graph
p1x = xbox * xstart;//start x
p1y = ybox * ystart;//start y
//lowwer point of the line on the graph
p2x = xbox * xfinish;//finish x
p2y = ybox * yfinish;//finish y
//draw y-axis numbers
//(+ve)
while(f != 0){
String s = String.valueOf(f);
p.drawString(s,(x + 5),m + 13);
m = m + b;
f = f - 1;
}
//(-ve)
m2 = y;
while(f2 != g-1){
String u = String.valueOf(f2);
p.drawString(u,(x + 5),m2 - 3);
m2 = m2 + b;
f2 = f2 - 1;
}
//draw x-axis numbers.
//(-ve)
while(g != 0){
String t = String.valueOf(g);
p.drawString(t,n,y - 5);
n = n + a;
g = g + 1;
}
//(+ve)
n2 = x + a;
while(g2 != g3+1){
String vw = String.valueOf(g2);
p.drawString(vw,n2 -10,y - 5);
n2 = n2 + a;
g2 = g2 + 1;
}
BasicStroke aLine2 = new BasicStroke(1.0F,
BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
graph.setStroke(aLine2);
//notch on numbers and grid lines
//left to right, top to bottom notches
int v2 = -5;
int v5 = 0;
while(i <= a1-1){
p.setColor(Color.lightGray);//lightgray line
p.drawLine(a,0,a,y1);//vertical lightgray
p.drawLine(0,b,x1,b);//horizontal lightgray
a = a + d;
b = b + e;
i = i + 1;
}
//notches
while(i2 <= a1){
p.setColor(Color.blue);//notch color
p.drawString("x",v2+2,y+3);//xaxis
p.drawString("x",x-4,v5+4);//yaxis
v5 = v5 + e;
v2 = v2 + d;
i2 = i2 + 1;
}
//draws the border of the graph
p.setColor(Color.black);
Rectangle2D.Float rect = new Rectangle2D.Float(0,0,x1,y1);
BasicStroke aLine = new BasicStroke(2.5F,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
graph.setStroke(aLine);
graph.draw(rect);
//draw cross
BasicStroke aLine3 = new BasicStroke(2.5F,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
graph.setStroke(aLine3);
p.drawLine(x,0,x,y1); //vertical line
p.drawLine(0,y,x1,y); //horizontal line
//display the value of graph width and graph height
String aw = String.valueOf(x1);
p.drawString("Graph Width = ", 50,90);
p.drawString(aw,150,90);
p.drawString("Graph Height = ", 50,110);
String ah = String.valueOf(y1);
p.drawString(ah,156,110);
//draw line on graph
BasicStroke aLine4 = new BasicStroke(1.5F,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
graph.setStroke(aLine4);
p.setColor(Color.red);
if(p1x <= x1 && p2x <= x1 && p1y <= y1 && p2y <= y1){
p.drawLine(p1x,p1y,p2x,p2y);
Color c = new Color(0,0,0);
p.setColor(c);
p.drawString("X", p1x-4,p1y+4);
p.drawString("X", p2x-4,p2y+4);
}
else{
p.setColor(Color.black);
p.drawRect(48,34,223,35);
p.setColor(Color.white);
p.fillRect(49,35,222,34);
p.setColor(Color.red);
p.drawString("Wrong co-ordinates!!!", 50,50);
p.drawString("Values exceede applet dimensions.", 50,65);
}
}
}
class ControlsA extends JPanel
{
private static final long serialVersionUID = 1L;
public ControlsA (Box a)
{
a = Box.createVerticalBox();
a.add(new JLabel("Please enter the values below:"));
a.add(new JLabel("a"));
JTextField g1 = new JTextField("0.0");
g1.setMaximumSize(new Dimension(100,30));
a.add(g1);
a.add(new JLabel("b"));
JTextField g2 = new JTextField("0.0");
g2.setMaximumSize(new Dimension(100,30));
a.add(g2);
a.add(new JLabel("c"));
JTextField g3 = new JTextField("0.0");
g3.setMaximumSize(new Dimension(100,30));
a.add(g3);
a.add(new JLabel("d"));
JTextField g4 = new JTextField("0.0");
g4.setMaximumSize(new Dimension(100,30));
a.add(g4);
a.add(new JButton("Plot"));
a.add(new JButton("Refine"));
add(a);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(200,100));
}
}
class ControlsB extends JPanel
{
private static final long serialVersionUID = 1L;
private Graph graph;
private JButton refineButton;
public ControlsB (Box b, Graph g) {
graph = g;
b = Box.createVerticalBox();
Box boxUpper = new Box(BoxLayout.X_AXIS);
boxUpper.add(new JLabel("Please enter range: "));
b.add(boxUpper);
Box boxX = new Box(BoxLayout.X_AXIS);
boxX.add(new JLabel(" x-axis "));
boxX.add(new JLabel("from"));
// Added final keyword.
final JTextField f1 = new JTextField("-5");
f1.setMaximumSize(new Dimension(100,30));
boxX.add(f1);
boxX.add(new JLabel(" to "));
JTextField f2 = new JTextField("5");
f2.setMaximumSize(new Dimension(100,30));
boxX.add(f2);
b.add(boxX);
//b.add(new JLabel(". "));
Box boxY = new Box(BoxLayout.X_AXIS);
boxY.add(new JLabel("y-axis "));
boxY.add(new JLabel("from"));
// Added final keyword.
final JTextField f3 = new JTextField("5");
f3.setMaximumSize(new Dimension(100,30));
boxY.add(f3);
boxY.add(new JLabel("to"));
JTextField f4 = new JTextField("-5");
f4.setMaximumSize(new Dimension(100,30));
boxY.add(f4);
b.add(boxY);
Box buttonBox = new Box(BoxLayout.X_AXIS);
buttonBox.add(new JButton("Plot"));
/*
* Made this an instance variable,
* and added ActionListener to it.
*/
refineButton = new JButton("Refine");
buttonBox.add(refineButton);
refineButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
int x = Integer.parseInt(f1.getText());
int y = Integer.parseInt(f3.getText());
/*
* Calling a method of Graph Class (setValues)
* and passing the values that we had got from
* the respective JTextFields.
*/
graph.setValues(x, y);
}
});
b.add(buttonBox);
add(b);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(200,100));
}
}
答案 2 :(得分:2)
因此,在JApplet中调用repaint()方法,一旦单击按钮,就会看到更改。
答案 3 :(得分:1)
您是否尝试过使用paint(p)
或p.repaint()
代替p.update(p.getGraphics())
?
我没有做过多年的Swing,我也记不清它的表现如何。一个肯定的事情是你必须知道什么时候是调用paint
,update
或validate
以及如何正确使用EventDispatcherThread(EDT)的好时机。否则你的应用程序将看起来像很多java swing应用程序:一堆填充的UI错误...
我不是说Swing是废话,我说如果你不知道它是如何工作的,那么你的用户界面将是一个垃圾。