#java #swing
#java #swing
Вопрос:
У меня возник вопрос относительно подхода к созданию пасьянса на Java.
Каков наилучший способ обращения с картами в Swing? Как я могу перетащить их и каков наилучший способ установить их в нужное положение?
Комментарии:
1. Совет — если вы правильно разыграете свои карты, вы можете обнаружить, что кто-то уже реализовал это за вас 🙂
2. Я беру карту из стопки, это … Раскладывание карт, боже, как здорово =)
3. Вероятно, лучший способ создать пасьянс на Java — это не пытаться сделать все с помощью Swing. Наоборот: используйте как можно меньше Swing. Один JFrame, JLabel, ImageIcon которого является буферизованным изображением, и все готово. Программисты Java-игр обычно не используют Swing: я знаю о Java 3D-играх, я знаю о Java-мобильных играх, я знаю о Java 2D-играх… Но я не о Java Swing играх 😉
Ответ №1:
каков наилучший способ установить их в правильные положения?
В этом вам может помочь схема перекрытия.
Ответ №2:
Каков наилучший подход для перетаскивания нескольких изображений? Я дошел до того, что использую Java2D для вывода двух изображений на JPanel, но я могу перетащить только одно из них. Я приложу свой исходный код. Проблема с моим решением заключается в том, что мне нужно перекрасить все окно, даже если я просто манипулирую одним элементом. Возможно ли обрабатывать объекты из карт, а не их изображения? Поэтому, когда я перемещаю одну карту, я перемещаю визуальное представление объекта, а не изображение (как я делаю сейчас).
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Java2d_MainPanel extends JPanel{
private static BufferedImage img = new logic.GetBufferedImage().getImage();
private JButton knapp = new JButton("Nytt bilde");
private JButton knapp2 = new JButton("Nytt bilde2");
private static BufferedImage img2 = new logic.GetBufferedImage().getImage2();
//coordinates for image 1
private int x1 = 0;
private int y1 = 0;
//coordinates for image 2
private int x2 = 50;
private int y2 = 50;
public Java2d_MainPanel(){
add(knapp);
add(knapp2);
knapp.addActionListener(new ButtonHandler());
knapp2.addActionListener(new ButtonHandler2());
addMouseMotionListener(new MouseMotionHandler());
}
public void newImage(ActionEvent e){
if(e.getSource().equals(knapp)){
img = new logic.GetBufferedImage().getImage();
repaint();
}
else if(e.getSource().equals(knapp2)){
img2 = new logic.GetBufferedImage().getImage2();
repaint();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
newPaint(g2d);
}
public void newPaint(Graphics2D g2d){
g2d.drawImage(img, x1, y1, null);
g2d.drawImage(img2, x2, y2,null);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Rabbits");
frame.add(new Java2d_MainPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 640);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class MouseMotionHandler extends MouseMotionAdapter {
@Override
public void mouseDragged(MouseEvent e) {
x1 = e.getX()-(img.getWidth()/2);
y1 = e.getY()-(img.getHeight()/2);
repaint();
}
}
class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent e) {
newImage(e);
}
}
class ButtonHandler2 implements ActionListener{
public void actionPerformed(ActionEvent e) {
newImage(e);
}
}
}