我正在尝试为Rectangle
元素添加边框,由于某种原因它无效,是否与JFrame
不兼容?我可以将整个JFrame
设置为有边框,但它无法使用我的矩形找到setBorder
。这是我的代码:
package trivia;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.border.Border;
@SuppressWarnings("serial")
public class Main extends JFrame{
boolean mainMenu = true;
static Color tan = Color.decode("#F4EBC3");
static Color darkGreen = Color.decode("#668284");
static Color buttonColor = Color.decode("#A2896B");
Rectangle header = new Rectangle(0, 0, 500, 100);
Rectangle body = new Rectangle(0, 100, 500, 400);
Rectangle start = new Rectangle(150, 150, 200, 40);
public Main() {
setTitle("Trivia Game!");
setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
@Override
public void paint(Graphics g) {
Dimension d = this.getSize();
Border blackline;
blackline = BorderFactory.createLineBorder(Color.black);
if(mainMenu = true){
g.setColor(darkGreen);
g.fillRect(header.x, header.y, header.width, header.height);
g.setFont(new Font("Courier", Font.BOLD, 24));
g.setColor(Color.BLACK);
drawCenteredString("Trivia Game!", d.width, 125, g);
g.setColor(tan);
g.fillRect(body.x, body.y, body.width, body.height);
g.setColor(buttonColor);
g.fillRect(start.x, start.y, start.width, start.height);
}
}
public void drawCenteredString(String s, int w, int h, Graphics g) {
FontMetrics fm = g.getFontMetrics();
int x = (w - fm.stringWidth(s)) / 2;
int y = (fm.getAscent() + (h- (fm.getAscent() + fm.getDescent())) / 2);
g.drawString(s, x, y);
}
public static void main(String[] args) {
@SuppressWarnings("unused")
Main m = new Main();
}
}
当我在paint
函数中添加它时:
start.setBorder(blackline);
它给了我错误:
The method setBorder(Border) is undefined for the type Rectangle
我不确定如何让它识别setBorder
功能,有人可以帮忙吗?非常感谢所有帮助!
答案 0 :(得分:3)
听起来像是在尝试绘制start
引用的矩形。在这种情况下,您希望在Graphics上调用方法,而不是在Rectangle上调用。所以:
g.drawRect(start.x, start.y, start.width, start.height);
答案 1 :(得分:3)
Rectangle
没有setBorder
方法,而是使用Graphics
设置Graphics#setColor(Color)
上下文的颜色,并使用Graphics#drawRect(int, int, int, int)
或{{1 }} Graphics2D#draw(Shape)
你可以防止这样做,并可能导致任何数量的令人讨厌的副作用,你真的不想要这些...... super.paint
等顶级容器,例如paint
;他们不是双重缓冲;还有一堆其他组件坐在框架的顶部,可以在框架上涂漆;相反,创建一个自定义组件,从JFrame
扩展而来覆盖它的JPanel
方法(确保首先调用paintComponent
)...... 见Painting in AWT and Swing, Performing Custom Painting和2D Graphics了解详情