Java 在面板中添加一个复杂的图像,并在一个自定义用户界面中围绕该图像添加按钮
如何将下面的图像放入Java 在面板中添加一个复杂的图像,并在一个自定义用户界面中围绕该图像添加按钮,java,swing,icons,jbutton,layout-manager,Java,Swing,Icons,Jbutton,Layout Manager,如何将下面的图像放入slavePanel,并在该JPanel的顶部调整JButtons,该按钮看起来像图像,但有正确的按钮环绕?(目前它们的形状为1行4列) 1) 您必须在每5个JButton()之前和之后准备图标 无焦点的基本图标 isRollover()的图标 isPressed()的图标 (二) 3) 将这些5个jbbutton放在JPanel上,画上圆圈(遥控器)从这开始,我开始改变MoveButton如下: this.setBorderPainted(false); 您可以给C
slavePanel
,并在该JPanel的顶部调整JButtons
,该按钮看起来像图像,但有正确的按钮环绕?(目前它们的形状为1行4列)
1) 您必须在每5个JButton()之前和之后准备图标
- 无焦点的基本图标
isRollover()的图标
isPressed()的图标
5个jbbutton
放在JPanel
上,画上圆圈(遥控器)从这开始,我开始改变MoveButton
如下:
this.setBorderPainted(false);
您可以给ControlPanel
。我还根据建议添加了一个背景图像和一些基于按钮模型
状态的视觉反馈
GridLayout
- 对于每一个组件,添加一个带有子图像的标签
- 对于每个其他组件,添加一个
,从中删除空间。使用子图像作为图标,但您需要其他图标来指示焦点、激活等。此示例在“按下”图标周围放置红色边框JButton
import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入java.net.URL;
导入javax.imageio.imageio;
公共类指南针按钮{
公共CompassButtons(BuffereImage bi){
int w=bi.getWidth();
inth=bi.getHeight();
int step=w/3;
JPanel p=新的JPanel(新的网格布局(3,3));
p、 挫折背景(颜色:黑色);
整数计数=0;
对于(int ii=0;ii{
System.out.println(ae.getActionCommand());
});
p、 添加(按钮);
}否则{
JLabel标签=新JLabel(新图像图标(图标));
p、 添加(标签);
}
计数++;
}
}
JPanel center=newjpanel(newgridbaglayout());
中间。背景(颜色。黑色);
加(p);
showMessageDialog(null,居中);
}
公共静态void main(字符串[]args)引发异常{
URL=新URL(“http://i.stack.imgur.com/SNN04.png");
final BufferedImage bi=ImageIO.read(url);
SwingUtilities.invokeLater(()->{
新罗盘按钮(bi);
});
}
}
“每5个按钮”5个按钮?我得到N/S/E/W为4 -但这是第五个按钮?@ Andrew Thompson <代码>这是第五个按钮?< /代码> EEEEHMM = = Enter键在中间区域(PANASONIC Reles有类似的设计)谢谢。上面编辑,中间的一个不重要,很难找到上/下/左/右,这很好用。@YumYumYum-heheh没有什么复杂的,这个帖子的回答很好(不包括我的人),是不是这一个很酷。请问button.setActionCommand(“+count”)的作用是什么代码>做什么?Oracle java doc only explain:设置此按钮的操作命令。但是现在我不知道Action命令是什么意思了……@JianHe它被传递给创建的ActionEvent
,可以通过ActionEvent.getActionCommand()
访问。我们可以交替使用ActionEvent.getSource()
来查找源组件(比如JButton
)。但更常见的情况是,我们为特定控件(或控件,如按钮和菜单)创建一个ActionListener
(或Action
,例如saveEditsAction
),然后获取操作命令或源组件变得不相关。在该示例中,我在单个操作侦听器中使用了action命令,以缩短代码,并在控制台中显示按钮“number”。我得到了它。谢谢现在我完全明白了。
package test;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import javax.swing.*;
public class New extends JFrame {
private static final long serialVersionUID = 1L;
private ImageIcon errorIcon =
(ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
private Icon infoIcon =
UIManager.getIcon("OptionPane.informationIcon");
private Icon warnIcon =
UIManager.getIcon("OptionPane.warningIcon");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
New t = new New();
}
});
}
public New() {
setLayout(new BorderLayout());
JPanel slavePanel = new NewPanel();
slavePanel.setLayout(new GridLayout(0, 2, 4, 4));
add(slavePanel);
JButton button = new JButton();
button.setBorderPainted(false);
button.setBorder(null);
button.setFocusable(false);
button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setPressedIcon(warnIcon);
button.setDisabledIcon(warnIcon);
slavePanel.add(button);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
package test;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
public class NewPanel extends JPanel {
private Image imageGui;
private static Dimension screen;
public NewPanel() {
try {
imageGui =
ImageIO.read(
(InputStream) NewPanel.class.getResourceAsStream(
"/image/ptz.png"));
} catch (IOException e) {
e.printStackTrace(System.err);
}
Border border = BorderFactory.createEmptyBorder(11, 11, 11, 11);
setOpaque(true);
setBorder(border);
setFocusable(true);
setSize(getPreferredSize());
revalidate();
repaint();
setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(imageGui, 0, 0,
imageGui.getWidth(null), imageGui.getHeight(null), null);
revalidate();
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(imageGui.getWidth(null), imageGui.getHeight(null));
}
}
this.setBorderPainted(false);
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;
public class CompassButtons {
public CompassButtons(BufferedImage bi) {
int w = bi.getWidth();
int h = bi.getHeight();
int step = w / 3;
JPanel p = new JPanel(new GridLayout(3, 3));
p.setBackground(Color.BLACK);
int count = 0;
for (int ii = 0; ii < w; ii += step) {
for (int jj = 0; jj < h; jj += step) {
// This is it - GET THE SUB IMAGE
Image icon = bi.getSubimage(jj, ii, step, step);
if (count % 2 == 1) {
JButton button = new JButton(new ImageIcon(icon));
// make it transparent
button.setContentAreaFilled(false);
// remove border, indicate press using different icon
button.setBorder(null);
// make a 'pressed' icon..
BufferedImage iconPressed = new BufferedImage(
step, step, BufferedImage.TYPE_INT_ARGB);
Graphics g = iconPressed.getGraphics();
g.drawImage(icon, 0, 0, p);
g.setColor(Color.RED);
g.drawRoundRect(
0, 0,
iconPressed.getWidth(p) - 1,
iconPressed.getHeight(p) - 1,
12, 12);
g.dispose();
button.setPressedIcon(new ImageIcon(iconPressed));
button.setActionCommand("" + count);
button.addActionListener((ActionEvent ae) -> {
System.out.println(ae.getActionCommand());
});
p.add(button);
} else {
JLabel label = new JLabel(new ImageIcon(icon));
p.add(label);
}
count++;
}
}
JPanel center = new JPanel(new GridBagLayout());
center.setBackground(Color.BLACK);
center.add(p);
JOptionPane.showMessageDialog(null, center);
}
public static void main(String[] args) throws Exception {
URL url = new URL("http://i.stack.imgur.com/SNN04.png");
final BufferedImage bi = ImageIO.read(url);
SwingUtilities.invokeLater(() -> {
new CompassButtons(bi);
});
}
}