- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我在面板上绘制图片并将其添加到框架上时遇到问题。
import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CardComponent extends JPanel {
int x;int y;
String[] str = {
"D:\\Images\\ImageCards\\Clubs_Ace.png",
"D:\\Images\\ImageCards\\Clubs_King.png",
"D:\\Images\\ImageCards\\Clubs_Queen.png",
"D:\\Images\\ImageCards\\Clubs_Jack.png",
"D:\\Images\\ImageCards\\Clubs_10.png",
"D:\\Images\\ImageCards\\Clubs_9.png",
"D:\\Images\\ImageCards\\Clubs_8.png",
"D:\\Images\\ImageCards\\Clubs_7.png",
"D:\\Images\\ImageCards\\Clubs_6.png",
"D:\\Images\\ImageCards\\Clubs_5.png",
"D:\\Images\\ImageCards\\Clubs_4.png",
"D:\\Images\\ImageCards\\Clubs_3.png",
"D:\\Images\\ImageCards\\Clubs_2.png",
"D:\\Images\\ImageCards\\Diamonds_Ace.png",
"D:\\Images\\ImageCards\\Diamonds_King.png",
"D:\\Images\\ImageCards\\Diamonds_Queen.png",
"D:\\Images\\ImageCards\\Diamonds_Jack.png",
"D:\\Images\\ImageCards\\Diamonds_10.png",
"D:\\Images\\ImageCards\\Diamonds_9.png",
"D:\\Images\\ImageCards\\Diamonds_8.png",
"D:\\Images\\ImageCards\\Diamonds_7.png",
"D:\\Images\\ImageCards\\Diamonds_6.png",
"D:\\Images\\ImageCards\\Diamonds_5.png",
"D:\\Images\\ImageCards\\Diamonds_4.png",
"D:\\Images\\ImageCards\\Diamonds_3.png",
"D:\\Images\\ImageCards\\Diamonds_2.png",
"D:\\Images\\ImageCards\\Hearts_Ace.png",
"D:\\Images\\ImageCards\\Hearts_King.png",
"D:\\Images\\ImageCards\\Hearts_Queen.png",
"D:\\Images\\ImageCards\\Hearts_Jack.png",
"D:\\Images\\ImageCards\\Hearts_10.png",
"D:\\Images\\ImageCards\\Hearts_9.png",
"D:\\Images\\ImageCards\\Hearts_8.png",
"D:\\Images\\ImageCards\\Hearts_7.png",
"D:\\Images\\ImageCards\\Hearts_6.png",
"D:\\Images\\ImageCards\\Hearts_5.png",
"D:\\Images\\ImageCards\\Hearts_4.png",
"D:\\Images\\ImageCards\\Hearts_3.png",
"D:\\Images\\ImageCards\\Hearts_2.png",
"D:\\Images\\ImageCards\\Spades_Ace.png",
"D:\\Images\\ImageCards\\Spades_Ace.png",
"D:\\Images\\ImageCards\\Spades_King.png",
"D:\\Images\\ImageCards\\Spades_Queen.png",
"D:\\Images\\ImageCards\\Spades_Jack.png",
"D:\\Images\\ImageCards\\Spades_10.png",
"D:\\Images\\ImageCards\\Spades_9.png",
"D:\\Images\\ImageCards\\Spades_8.png",
"D:\\Images\\ImageCards\\Spades_7.png",
"D:\\Images\\ImageCards\\Spades_6.png",
"D:\\Images\\ImageCards\\Spades_5.png",
"D:\\Images\\ImageCards\\Spades_4.png",
"D:\\Images\\ImageCards\\Spades_3.png",
"D:\\Images\\ImageCards\\Spades_2.png"
};
Image img;
public CardComponent(int x,int y) {
setOpaque(false);
this.x = x;
this.y = y;
setSize(100,150);
setVisible(true);
}
public void paint(Graphics g) {
super.paint(g);
Random r = new Random();
String s = "";
s = str[r.nextInt(str.length)];
img = getToolkit().getImage(s);
g.drawImage(img,this.x , this.y, 100, 150, this);
}
public static void main(String[] args) {
CardComponent cc = new CardComponent(10,150);
JFrame jfrm = new JFrame();
jfrm.setSize(100, 150);
jfrm.setVisible(true);
jfrm.getContentPane().add(cc);
}
}
在类上层是主要问题(无法绘制卡片)。我将这个东西添加到主框架(代码下层)。我在每个类中添加了 main 方法只是为了检查它是否正常工作。 导入java.awt.Button; 导入java.awt.Color; 导入 java.awt.event.ActionEvent; 导入 java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class PanelButtons extends JPanel{
Button but1;
Button but2;
Button but3;
JLabel jlab;
JSlider jsl;
public PanelButtons() {
setLayout(null);
Color c = new Color(0,120,0);
setSize(700,200);
setLocation(0,0);
setOpaque(false);
but1 = new Button("Check");
but1.setBackground(Color.CYAN);
but1.setLocation(660, 350);
but1.setBounds(683, 650, 70, 40);
add(but1);
but2 = new Button("Fold");
but2.setBackground(Color.CYAN);
but2.setLocation(660, 350);
but2.setBounds(753, 650, 70, 40);
add(but2);
but3 = new Button("Bet");
but3.setBackground(Color.CYAN);
but3.setLocation(660, 350);
but3.setBounds(823, 650, 70, 40);
add(but3);
int money = Player.PremierMoney();
jsl = new JSlider(0,1000);
jsl.setMajorTickSpacing(50);
jsl.setMinorTickSpacing(10);
jsl.setLabelTable(jsl.createStandardLabels(100));
jsl.setPaintTicks(true);
jsl.setPaintLabels(true);
jsl.setSize(400, 150);
jsl.setBackground(c);
jlab = new JLabel("Ваша ставка"+jsl.getValue());
jsl.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent ce) {
if(jsl.getValueIsAdjusting()) return;
jlab.setText("Ваша ставка:"+jsl.getValue());
}
});
jlab.setHorizontalTextPosition(JLabel.CENTER);
jlab.setVerticalAlignment(JLabel.BOTTOM);
jsl.setLocation(900,600);
jlab.setLocation(150,150);
add(jsl);
add(jlab);
but2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
but1.setEnabled(false);
but2.setEnabled(false);
but3.setEnabled(false);
}
});
}
public static void main(String[] args) {
JFrame jfrm = new JFrame("Some frame");
jfrm.setSize(200, 200);
PanelButtons pb = new PanelButtons();
jfrm.setContentPane(pb);
jfrm.setVisible(true);
jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
}
}
此类描述按钮和 slider 。 导入java.awt.Color; 导入 javax.swing.JFrame;
public class Images extends JFrame{
Images() {
// CardComponent cc = new CardComponent(530,550);
PanelButtons pb = new PanelButtons();
Color c = new Color(0,120,0);
// cc.setBounds(530, 550, 100, 150);
setSize(1366,750);
setBackground(c);
setContentPane(pb);
// setContentPane(cc);
setVisible(true);
}
public static void main(String[] args) {
Images im = new Images();
im.setResizable(false);
im.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
这是我添加面板的主框架。所以主要问题是我在哪里画卡片。感谢您的帮助。
最佳答案
整个程序存在很多问题,null
布局的选择是一个重要的问题,这会给你带来很多问题。
但是,您面临的重大问题在于您的 paint
方法
public void paint(Graphics g) {
super.paint(g);
Random r = new Random();
String s = "";
s = str[r.nextInt(str.length)];
System.out.println(s);
img = getToolkit().getImage(s);
g.drawImage(img, this.x, this.y, 100, 150, this);
}
此方法存在三个问题。
paintComponent
,它是执行自定义绘制的更安全的方法。Graphics
上下文已被转换,因此点0x0将位于组件的左上角。这意味着,所有绘画都是相对的。您的代码执行此操作...
g.drawImage(img, this.x, this.y, 100, 150, this);
这意味着图像将在相对于组件顶部/左侧位置的 x/y 像素处绘制。相反,您应该在 0x0 位置周围绘画。
在您的示例中,您也这样做
jfrm.setVisible(true);
jfrm.getContentPane().add(cc);
这通常是一个坏主意,你应该切换这两个语句,否则看起来就像什么也没画。
您可能会发现值得阅读一下
用一个简单的例子更新
此示例旨在演示 paint
方法可以承受的命中数量以及局部坐标空间的概念。
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.io.File;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Cards {
public static void main(String[] args) {
new Cards();
}
public Cards() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame jfrm = new JFrame();
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setSize(100, 150);
jfrm.setVisible(true);
jfrm.add(new TestPane());
}
});
}
public class TestPane extends JPanel {
public TestPane() {
CardComponent cc = new CardComponent();
setLayout(new GridBagLayout());
add(cc);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
FontMetrics fm = g.getFontMetrics();
// Simply render the location of the component relative to it's parent.
for (Component comp : getComponents()) {
String text = comp.getX() + "x" + comp.getY();
g.drawString(text, comp.getX(), comp.getY() - fm.getHeight() + fm.getAscent());
}
}
}
public class CardComponent extends JPanel {
String[] str;
Image img;
private int paintCount;
public CardComponent() {
File[] files = new File("C:\\Users\\swhitehead\\Documents\\My Dropbox\\MegaTokyo").listFiles();
str = new String[files.length];
for (int index = 0; index < files.length; index++) {
str[index] = files[index].getPath();
}
setOpaque(false);
setVisible(true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 150);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
public void paint(Graphics g) {
paintCount++;
System.out.println(paintCount);
super.paint(g);
Random r = new Random();
String s = "";
s = str[r.nextInt(str.length)];
img = getToolkit().getImage(s);
// Drawing image in the top left corner of the component
g.drawImage(img, 0, 0, 100, 150, this);
g.setColor(Color.RED);
g.drawRect(0, 0, getWidth(), getHeight());
FontMetrics fm = g.getFontMetrics();
String text = "Local 0x0";
g.drawString(text, 0, fm.getAscent());
}
}
}
通过这个例子,我什至在触摸框架之前就能够将 paintCount
达到 3640。
在任何 paint
方法中加载图像也是一个坏主意。 paint
方法应该尽快返回,否则会降低程序的性能。
关于java - 绘制 JPanel/JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15849059/
我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 SDL 和 OpenGL 的程序。我是这样设置的: SDL_Init(SDL_INIT_VIDEO); window = SDL_Cr
尝试查找可在地块中使用的不同类型项目的列表 来自不同样本的投影类型: projection = list(type = "equirectangular") projection = list(typ
我正在尝试使用 Java Graphics API 绘制 GIF,但无法使用下面的代码成功绘制 GIF。仅绘制 GIF 的第一张图像或缩略图,但不播放。 public void paintCompon
我目前正在使用 JFrame 并尝试绘制一个矩形,但我不知道如何执行代码 paint(Graphics g),如何获取 Graphics 对象? package com.raggaer.frame;
这个领域的新手,希望得到一些帮助。 我有一个"Missile.java" 类,我在那里画东西。我想绘制一个 ImageView,我正在使用以下代码: ImageView v = (ImageView)
下面列出了圆形的例子 这是我的 JavaScript 代码。 最佳答案 假设您的 randomColor 是正确的,您只需要: 从 canvas.onclick 中移除 context.clearR
我在绘制和缩放 ImageView 时遇到问题。请帮帮我.. 当我画一些东西然后拖动或缩放图像时 - 绘图保留在原处,如您在屏幕截图中所见。而且我只需要简单地在图片上绘图,并且可以缩放和拖动这张图片。
我们可以在形式之外绘制图像和文本...我的意思是在字面上... 我知道问这个问题很愚蠢但是我们能不能... 最佳答案 您可以通过创建表单并将其 TransparentColor 属性设置为背景色来“作
我在绘制/布局期间收到 3 个对象分配警告 super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint textPaint = new Pai
我有一个示例时间序列数据框: df = pd.DataFrame({'year':'1990','1991','1992','1993','1994','1995','1996',
我试图想出一种简洁的方法来绘制 R 数据框中所有列的 GridView 。问题是我的数据框中既有离散值又有数值。为简单起见,我们可以使用 R 提供的名为 iris 的示例数据集。我会使用 par(mf
我有一个由 10 列和 50 行组成的 data.frame。我使用 apply 函数逐列计算密度函数。现在我想绘制我一次计算的密度。 换句话说,而不是绘图... plot(den[[1]]) plo
我想知道我们如何才能在第一个和第二个组件之外绘制个人,如下所示: 最佳答案 这可能有效: pc.cr <- princomp(USArrests, cor = TRUE) pairs(pc.cr$lo
我是Pandas和matplotlib的新手,想绘制此DataFrame season won team matches pct_won 0 20
我正在尝试为 distplot 子图编写一个 for 循环。 我有一个包含许多不同长度列的数据框。 (不包括 NaN 值) fig = make_subplots( rows=len(asse
我想创建一个具有密度的 3d 图。 我使用函数 density 首先为特定的 x 值创建一个二维图,然后该函数创建密度并将它们放入 y 变量中。现在我有第二组 x 值并将其再次放入密度函数中,然后我得
全部, 我一直在研究全局所有 MTB 步道的索引。我是 Python 人,所以对于所有涉及的步骤,我都尝试使用 Python 模块。 我能够像这样从 OSM 立交桥 API 中获取关系: from O
我正在使用 e1071 包中的支持向量机对我的数据进行分类,并希望可视化机器实际如何进行分类。但是,在使用 plot.svm 函数时,出现无法解决的错误。 脚本: library("e1071") d
我制作了以下图表,它是使用 xts 对象创建的。 我使用的代码很简单 plot(graphTS1$CCLL, type = "l", las = 2, ylab = "(c)\nCC for I
在绘制状态图时,您如何知道哪些状态放在框中,哪些状态用于转换箭头?我注意到转换也是状态。 我正在查看 this page 上的图 1 : 最佳答案 转换不是状态。转换是将对象从一种状态移动到下一种状态
我是一名优秀的程序员,十分优秀!