其实我是java gui的新手,在这里我想改变矩形高度,每当我们在文本字段中放东西并按下按钮,但我不知道该怎么做,实际上我查了一大堆但是我找不到一个简单的方法。实际上我找不到如何更改MyPanel类中paintComponent内部的矩形大小。
(高度变化的逻辑是元首和小的元音,以及字符串中的元素和其他东西)
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Hist{
int h1=0,h2=0,h3=0,h4=0,h5=0;
JFrame f=new JFrame();
JButton b=new JButton("click");
JTextField text=new JTextField(30);
public static void main(String args[]){
Hist h=new Hist();
}
Hist(){
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new FlowLayout());
f.add(new MyPanel(h1,h2,h3,h4,h5));
f.setSize(400,300);
f.setVisible(true);
f.add(b);
f.add(text);
thehandler handler=new thehandler();
b.addActionListener(handler);
}
class thehandler implements ActionListener{
public void actionPerformed(ActionEvent event){
if(event.getSource()==b){
h1=0;h2=0;h3=0;h4=0;h5=0;
String s;
s=text.getText();
char[] ar=s.toCharArray();
for(int i=0;i<s.length();i++){
if(ar[i]=='a'||ar[i]=='e'||ar[i]=='i'||ar[i]=='o'||ar[i]=='u'){
h1=h1+10;
}
else if(ar[i]=='A'||ar[i]=='E'||ar[i]=='I'||ar[i]=='O'||ar[i]=='U'){
h2=h2+10;
}
else{
h5=h5+10;
}
}
}
}
}
}
class MyPanel extends JPanel{
int x1,x2,x3,x4,x5;
public MyPanel(int a,int b,int c,int d,int e){
setBorder(BorderFactory.createLineBorder(Color.BLACK));
x1=a;x2=b;x3=c;x4=d;x5=e;
}
public Dimension getPreferredSize(){
return new Dimension(350,200);
}
public void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.red);
g.fillRect(25, 25, 30,x1);
g.setColor(Color.red);
g.fillRect(75, 25, 30, x2);
g.setColor(Color.red);
g.fillRect(125, 25, 30,x3);
g.setColor(Color.red);
g.fillRect(175, 25, 30, x4);
g.setColor(Color.red);
g.fillRect(225, 25, 30, x5);
}
}
答案 0 :(得分:5)
“实际上我找不到如何更改paintComponent内的矩形大小”
看起来你正在做的方式只会改变身高而不是y
位置。如果它是一个颠倒的直方图,哪个会好的。
你需要做的是y的起点,对于高度为450的屏幕,请说400,所以地平线靠近底部
int y = 400;
所以当你画画时会是
g.fillRect(25, y - height, 30, height)
现在高度将是y起点,400。当你想要增加它时,你实际上需要减少400.
因此,如果你想要高度为150,那么你需要-150
g.fillRect(25, y - 150, 30, height);
这将使效果从地平线上升一个柱
对于每个g.fillRect
,您应该计算一个新的高度,这样您就可以height
变量。和final INCREMENT
变量基于多少个元音。像这样的东西
final int INCREMENT = 25;
int height;
....
height = numberOfAs * INCREMENT;
g.fillRect(25, y - height, 30, height);
height = numberOfEs * INCREMENT;
g.fillRect(75, y - height, 30, height);
height = numberOfOs * INCREMENT;
g.fillRect(125, y - height, 30, height);
height = numberOfIs * INCREMENT;
g.fillRect(175, y - height, 30, height);
height = numberOfUs * INCREMENT;
g.fillRect(225, y - height, 30, height);
运行此示例以查看我正在谈论的内容
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Histogram extends JPanel {
private static final int DIM_WIDTH = 300;
private static final int DIM_HEIGHT = 450;
int height;
private static final int INCREMENT = 50;
int numberOfAs = 4;
int numberOfEs = 2;
int numberOfIs = 1;
int numberOfOs = 5;
int numberOfUs = 6;
int y = 400;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
height = numberOfAs * INCREMENT;
g.fillRect(25, y - height, 30, height);
height = numberOfEs * INCREMENT;
g.fillRect(75, y - height, 30, height);
height = numberOfOs * INCREMENT;
g.fillRect(125, y - height, 30, height);
height = numberOfIs * INCREMENT;
g.fillRect(175, y - height, 30, height);
height = numberOfUs * INCREMENT;
g.fillRect(225, y - height, 30, height);
}
public static void createAndShowGui() {
JFrame frame = new JFrame();
frame.add(new Histogram());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public Dimension getPreferredSize() {
return new Dimension(DIM_WIDTH, DIM_HEIGHT);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
从左到右,每个字母的INCREMENT
为50像素
As = 4;
Es = 2;
Os = 5;
Is = 1;
Us = 6;
在您希望能够使用文本字段条目控制重绘的程序中,您可以在setters
类中设置MyPanel
numberOfXs
变量的值。从用于获取它们的任何方法中获取它们之后,只需调用setNumberOfAs(int numberOfAs)
和其他setter,然后调用repaint。因此,每次从textField获取输入,并且您已更新MyPanel
中的变量标题时,绘制的直方图应该更新。
<强>更新强>
另一种方法是将ActionListener
和同为MyPanel
的{{1}} 内部类。这样他们就可以共享Hist
的全局变量。创建Hist
类的NumberOfXs
变量成员,以便所有内部类可以共享。在Hist
的{{1}}课程中,相应地更改变量,ActionListener
actionPerformed
。如果你这样做,你就不需要将参数传递给repaint
更新2
我不想为你做完整的作业,所以我会给你一个基本的大纲。
MyPanel
MyPanel
的{{1}}变量类成员,而不是Hist
numberOfXs
中创建Hist
的{{1}}实例作为类成员,以便MyPanel
MyPanel
中Hist
的值,然后调用重绘像这样的东西
ActionListener
答案 1 :(得分:2)
在MyPanel中定义一个方法来传递值并将它们设置为x1 - x5字段。
e.g。
public void setValues(int a,int b,int c,int d,int e){
x1=a;x2=b;x3=c;x4=d;x5=e;
}
当某些内容只是使用正确的计算值调用setValues()时。