Java Jprogressbar.setstringpaint(真);他正在画两根弦
这段代码产生了一个问题,当我点击按钮时,两个字符串被绘制,一个水平,一个垂直,但只需要绘制水平字符串,所以请告诉我应该怎么做Java Jprogressbar.setstringpaint(真);他正在画两根弦,java,swing,paintcomponent,custom-component,jprogressbar,Java,Swing,Paintcomponent,Custom Component,Jprogressbar,这段代码产生了一个问题,当我点击按钮时,两个字符串被绘制,一个水平,一个垂直,但只需要绘制水平字符串,所以请告诉我应该怎么做 import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jav
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class R implements ActionListener {
static int y;
CustomProgressBar b = new CustomProgressBar();
public static void main(String arg[]) throws Exception {
new R();
}
public R() throws Exception {
JFrame f = new JFrame();
JButton btn = new JButton("Click");
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setUndecorated(true);
f.setLayout(new FlowLayout());
btn.addActionListener(this);
f.add(b);
f.add(btn);
f.setVisible(true);
}
class CustomProgressBar extends JProgressBar{
private static final long serialVersionUID = 1L;
private boolean isStringToBePainted = false;
public CustomProgressBar() {
super(JProgressBar.VERTICAL,0,100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(isStringToBePainted ) {
Dimension size = CustomProgressBar.this.getSize();
if( CustomProgressBar.this.getPercentComplete()<0.9 )
R.y = (int)( size.height - size.height * CustomProgressBar.this.getPercentComplete() );
String text = getString();
g.setColor(Color.BLACK );
g.drawString(text, 0, R.y);
}
}
@Override
public void setStringPainted(boolean b) {
super.setStringPainted(b);
isStringToBePainted=b;
}
}
@Override
public void actionPerformed(ActionEvent e) {
b.setStringPainted(true);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
公共类R实现ActionListener{
静态智力;
CustomProgressBar b=新的CustomProgressBar();
公共静态void main(字符串arg[])引发异常{
新R();
}
公共R()引发异常{
JFrame f=新的JFrame();
JButton btn=新JButton(“单击”);
f、 setExtendedState(JFrame.MAXIMIZED_两者);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 未装饰的设置(真实);
f、 setLayout(新的FlowLayout());
btn.addActionListener(此);
f、 添加(b);
f、 添加(btn);
f、 setVisible(真);
}
类CustomProgressBar扩展了JProgressBar{
私有静态最终长serialVersionUID=1L;
私有布尔值IsStringTobePaint=false;
公共定制进度条(){
超级(JProgressBar.VERTICAL,0100);
}
@凌驾
受保护组件(图形g){
超级组件(g);
如果(IsStringTobePaint){
维度大小=CustomProgressBar.this.getSize();
如果(CustomProgressBar.this.getPercentComplete()问题是,组件已在中定义了属性SetStringPaint
,并且具有预定义的功能…您知道该功能似乎要更改
您也需要定义自己的新属性,您可以控制或更改UI委托的工作方式,这是一项艰巨的工作,因为您需要为您可能想要支持的每个外观和感觉提供一个属性
例如,你可以作弊(一点)…并使用JLabel
来代替定制绘画
class CustomProgressBar extends JProgressBar {
private static final long serialVersionUID = 1L;
private boolean isStringToBePainted = false;
private JLabel progress;
public CustomProgressBar() {
super(JProgressBar.VERTICAL, 0, 100);
progress = new JLabel("0%");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weighty = 1;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.SOUTH;
add(progress, gbc);
}
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
Dimension labelSize = progress.getPreferredSize();
Insets insets = getInsets();
if (size.width < labelSize.width) {
size.width = insets.left + insets.right + labelSize.width;
}
return size;
}
}
class CustomProgressBar扩展了JProgressBar{
私有静态最终长serialVersionUID=1L;
私有布尔值IsStringTobePaint=false;
私人JLabel进程;
公共定制进度条(){
超级(JProgressBar.VERTICAL,0100);
进度=新的JLabel(“0%”);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weighty=1;
gbc.weightx=1;
gbc.anchor=gridbag.SOUTH;
添加(进度,gbc);
}
@凌驾
公共维度getPreferredSize(){
维度大小=super.getPreferredSize();
维度标签大小=进度。getPreferredSize();
Insets Insets=getInsets();
if(size.width
您仍然需要提供自己的属性来打开或关闭它,但这是一个想法
(ps-我快速查看了一下如何实现自己的UI委托,在复制并粘贴了第三种方法后,我放弃了,因为这将比奖励提供的工作量更多)