我有这个内在的课程:
private class Plats extends JComponent{
private String namn;
Plats(int x, int y, String n){
namn=n;
setBounds(x-10, y-10, 150, 40);
setPreferredSize(new Dimension(20, 20));
setMinimumSize(new Dimension(20, 20));
setMaximumSize(new Dimension(20, 20));
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(0, 0, 20, 20);
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(namn, 0, 34);
}
public boolean contains(int x, int y){
return x<20 && x>0 && y<20 && y>0;
}
}
我想将组件的边界设置为构造函数获取的字符串的宽度,但是如果我在paintComponent方法中执行它,我只能使它工作,因为我需要图形对象。在paintComponent方法中执行它感觉不对,因为每次重新绘制组件时它都会再次设置边界,我只想在创建它时执行一次。
建议我怎么解决这个问题?或者我应该只在paintComponent中做它?它可以工作,但我觉得不是一个很好的解决方案:(?
答案 0 :(得分:2)
请不要使用AbsoluteLayout
,只有在确实有重要原因的情况下,请使用正确的LayoutManager
,
您的JComponent
应该返回PreferredSize
(所有标准或自定义LayoutManagers都不接受通知PreferredSize
)到其父级或容器,例如
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class CustomComponent extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent() {
setTitle("Custom Component Graphics2D");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void display() {
CustomComponents cc = new CustomComponents();
/*cc.addComponentListener(new java.awt.event.ComponentAdapter() {
@Override
public void componentResized(ComponentEvent event) {
setSize(Math.min(getPreferredSize().width, getWidth()),
Math.min(getPreferredSize().height, getHeight()));
}
});*/
add(cc, BorderLayout.CENTER);
CustomComponents cc1 = new CustomComponents();
add(cc1, BorderLayout.EAST);
pack();
// enforces the minimum size of both frame and component
setMinimumSize(getSize());
//setMaximumSize(getMaximumSize());
setVisible(true);
}
public static void main(String[] args) {
CustomComponent main = new CustomComponent();
main.display();
}
}
class CustomComponents extends JComponent {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(800, 600);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
}
答案 1 :(得分:1)
即使没有图形上下文,您也可以使用TextLayout
或FontRenderContext
来查找边界;将两者进行比较here。由于您扩展了JComponent
,因此您的组件应覆盖getXxxSize()
方法,如mKorbel的answer所示。
答案 2 :(得分:0)
您可以使用Font#getStringBounds(String str,FontRenderContext frc)以所述Font的形式获取字符串的边界矩形。从那里你可以返回宽度和高度。