java 组件 未显示出来_java – 自定义组件未显示

当我将组件的大小设置为超出组件位置的x和y时,它们都会显示出来,否则它们就不会出现.

这是我的代码:

public class AdamakPogram{

public static void main(String[] args) {

PlayGround playGround = new PlayGround();

Adamak ad1 = new Adamak();

Adamak ad2 = new Adamak();

ad1.setLocation(100,100);

ad2.setLocation(150, 100);

ad1.addMouseListener(new FocusListener(ad1));

ad1.addKeyListener(new ArrowListener(ad1));

playGround.addPerson(ad1);

ad2.addMouseListener(new FocusListener(ad2));

ad2.addKeyListener(new ArrowListener(ad2));

playGround.addPerson(ad2);

}

}

我的PlayGround课程:

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

public class PlayGround extends JFrame{

private static final long serialVersionUID = 1L;

private JPanel zone;

public PlayGround() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 800, 600);

setResizable(false);

zone = new JPanel();

zone.setBorder(new EmptyBorder(5, 5, 5, 5));

zone.setBounds(100, 100, 800, 600);

setContentPane(zone);

zone.setLayout(null);

setVisible(true);

}

public void addPerson(Adamak adamak){

zone.add(adamak);

revalidate();

repaint();

}

public JPanel getZone() {

return zone;

}

public void setZone(JPanel zone) {

this.zone = zone;

}

}

我的adamak(自定义组件)类:

import java.awt.Graphics;

import java.awt.Point;

import javax.swing.JComponent;

public class Adamak extends JComponent {

private static final long serialVersionUID = 1L;

@Override

protected void paintComponent(Graphics arg0) {

super.paintComponent(arg0);

Point point = getLocation();

arg0.drawRect(point.x-10, point.y-10, 20, 50);//drawing stomach

arg0.drawLine(point.x+10,point.y, point.x+20, point.y+50);//drawing right hand

arg0.drawLine(point.x-10, point.y, point.x-20, point.y+50);//drawing left hand

arg0.drawLine(point.x, point.y-10, point.x, point.y-20);//drawing neck

arg0.drawLine(point.x-5, point.y+40, point.x-5, point.y+100);//drawing left leg

arg0.drawLine(point.x+5, point.y+40, point.x+5, point.y+100);//drawing right leg

arg0.drawOval(point.x-10, point.y-40, 23, 20);//drawing head

arg0.drawRect(point.x-20, point.y-40, 40, 140);

}

public void moveRight(){

Point point = getLocation();

if((point.x+1-20) < 710){

setLocation(new Point(point.x+1, point.y));

setBounds(point.x-20,point.y-40,710-40,461-140);

repaint();

}

}

public void moveLeft(){

Point point = getLocation();

if((point.x-1-20) > 0){

setLocation(new Point(point.x-1,point.y));

setBounds(point.x-20,point.y-40,710-40,461-140);

repaint();

}

}

public void moveUp(){

Point point = getLocation();

if((point.y-1-40) > 0){

setLocation(new Point(point.x,point.y-1));

setBounds(point.x-20,point.y-40,710-40,461-140);

repaint();

}

}

public void moveDown(){

Point point = getLocation();

if((point.y+1-100) < 461){

setLocation(new Point(point.x,point.y+1));

setBounds(point.x-20,point.y-40,710-40,461-140);

repaint();

}

}

}

任何帮助,将不胜感激.

解决方法:

将子组件添加到空布局(绝对定位)时,应准确指定组件的位置和尺寸.

使用setbounds(x,y,width,height)方法就可以做到.

因为你设置adamax组件的位置setSize()就足够了.

Adamak ad1 = new Adamak();

ad1.setSize(300, 300);

ad1.setLocation(100, 100);

或使用setBounds()

Adamak ad1 = new Adamak();

ad1.setBounds(100,100,300,300);

编辑

这是给你的评论

是的,让我解释一下你正在绘制的矩形.

主要问题是这段代码

Point point = getLocation();

在这种情况下,这会将Adamakrelative的位置返回到它的父容器

ad1.setLocation(100,100);

并从您调用的paintComponent方法

Point point = getLocation();

现在point.x = 100,po​​int.y = 100

然后使用绘制外框

arg0.drawRect(point.x-20, point.y-40, 40, 140);

与…一样

arg0.drawRect(80,60,40,140);

但你希望你的组件宽度为40,这怎么可能?

它从80的组件的x开始绘制,但你的面板的宽度为40.所以你什么也看不到.至少(80 40)宽度组件需要显示在矩形的右边,但是边框线有一些厚度所以你需要120宽度组件来显示它.

你想要的是改变这一点

例如

Point point = new Point(20, yyy);

arg0.drawRect(point.x-20, point.y-40, 40, something);

现在40宽度组件很好.因为这是相同的

arg0.drawRect(0,point.y-40,40,something);

它从右上角开始绘制,它是0,宽度是40,组件的宽度是40,同样是y和高度

这是输出

标签:java,swing,jcomponent

来源: https://codeday.me/bug/20190708/1400047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java窗体组件的样式可以通过修改UI(User Interface)来自定义Java的Swing组件库提供了一种称为“可插拔外观(Pluggable Look and Feel)”的机制,使得可以在不修改应用程序代码的情况下,改变应用程序的外观和感觉。 可以通过编写自定义UI类来实现对Swing组件的自定义样式。例如,以下代码演示了如何创建一个自定义按钮UI,并将其应用于JButton组件: ```java import java.awt.*; import javax.swing.*; public class CustomButtonUI extends BasicButtonUI { // 重写绘制按钮的方法,实现自定义样式 @Override public void paint(Graphics g, JComponent c) { JButton button = (JButton) c; Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.BLUE); g2.fillRoundRect(0, 0, button.getWidth(), button.getHeight(), 10, 10); g2.setColor(Color.WHITE); g2.drawString(button.getText(), button.getWidth() / 2 - button.getFontMetrics(button.getFont()).stringWidth(button.getText()) / 2, button.getHeight() / 2 + button.getFontMetrics(button.getFont()).getHeight() / 3); } } // 创建一个自定义按钮 JButton button = new JButton("Click me!"); // 应用自定义UI button.setUI(new CustomButtonUI()); ``` 上述代码中,首先创建了一个自定义的按钮UI类CustomButtonUI,重写了paint方法,实现自定义样式。然后创建了一个JButton,将自定义UI应用于该按钮组件。 通过这种方式,可以对各种Swing组件进行自定义样式的设置,实现更加美观的界面效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值