问题
I am trying to add a border to a Rectangle
element and for some reason it will not work, is it not compatible with JFrame
? I can set my entire JFrame
to having a border, but it can't find setBorder
with my rectangles. Here is my code:
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();
}
}
And when I add this in my paint
function:
start.setBorder(blackline);
It gives me the error:
The method setBorder(Border) is undefined for the type Rectangle
I am not sure how I can make it recognize the setBorder
function, can anyone help? All help is much appreciated!
回答1:
Sounds like you're trying to draw the rectangle referenced by start
. In that case, you want to be invoking a method on a Graphics, not on a Rectangle. So:
g.drawRect(start.x, start.y, start.width, start.height);
回答2:
Rectangle
does not have asetBorder
method, instead, set the color of theGraphics
context usingGraphics#setColor(Color)
and either useGraphics#drawRect(int, int, int, int)
orGraphics2D#draw(Shape)
- You're breaking the paint chain. Painting is made up of a series of chained method calls, which when called correctly, paint the current component and its child components. By not calling
super.paint
you're preventing from doing this and could cause any number of nasty side effects, none of which you really want... - You should avoid overriding
paint
of top level containers, likeJFrame
, for a number of reasons; they're not double buffered; there a bunch of other components sitting on top of the frame which may paint over it; etc. Instead, create a custom component, extending from something likeJPanel
and override it'spaintComponent
method instead (ensuring that you callsuper.paintComponent
first)...
See Painting in AWT and Swing, Performing Custom Painting and 2D Graphics for more details
来源:https://stackoverflow.com/questions/27457235/how-to-add-a-border-to-a-rectangle-in-java-using-setborder-and-jframe