Hallo zusammen,
ich möchte um meine Java Kenntnisse zu verbessern ein Malprogramm machen. Da ich keine konkrete Vorstellung habe, habe ich einfach drauf los programmiert.
Bisher funktioniert alles super, bin eigentlich zufrieden. Habe viele Sachen gelernt und konnte es direkt einbauen. Einige Sachen stören mich dennoch:
1 : Wenn ich etwas male und dann verschiebe mit den Slidern dann sieht das nicht richtig aus, das Canvas wird "über" andere Sachen drüber geschoben und die Sachen werden erst wieder sichtbar wenn ich einen Punkt male.
2 : Das Programm fängt stark zu ruckeln an wenn ich mehrere Sachen male und verschiebe, irgendetwas stimmt doch nicht??
edit:
3. Ich benutze für die GUI den WindowBuilder. Irgendwie ist das was ich in der Vorschau sehe nicht das was auch beim Starten herauskommt, woran liegt das?
/edit
Vielleicht hat wer eine Idee oder einen groben Ansatz was ich besser machen kann?
Gruß
ich möchte um meine Java Kenntnisse zu verbessern ein Malprogramm machen. Da ich keine konkrete Vorstellung habe, habe ich einfach drauf los programmiert.
Bisher funktioniert alles super, bin eigentlich zufrieden. Habe viele Sachen gelernt und konnte es direkt einbauen. Einige Sachen stören mich dennoch:
1 : Wenn ich etwas male und dann verschiebe mit den Slidern dann sieht das nicht richtig aus, das Canvas wird "über" andere Sachen drüber geschoben und die Sachen werden erst wieder sichtbar wenn ich einen Punkt male.
2 : Das Programm fängt stark zu ruckeln an wenn ich mehrere Sachen male und verschiebe, irgendetwas stimmt doch nicht??
edit:
3. Ich benutze für die GUI den WindowBuilder. Irgendwie ist das was ich in der Vorschau sehe nicht das was auch beim Starten herauskommt, woran liegt das?
/edit
Vielleicht hat wer eine Idee oder einen groben Ansatz was ich besser machen kann?
Gruß
Java:
package gui;
import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MainWindow {
private int lastX, lastY;
private JFrame frameMalProgramm;
private JPanel panelTop;
private JPanel panelColorPicked;
private Canvas panelDraw;
private JPanel panelDrawShow;
private JScrollPane scrollPane;
private JSlider sliderLineSize;
private JLabel labelLineSize;
private JScrollBar horScroll, verScroll;
private Color COLOR_PICKED = Color.black;
private int DRAW_SIZE = 5;
private static MainWindow w;
private boolean TOOL_BAR_VISIBLE = true;
private boolean RIGHT_MOUSE_DOWN = false;
private int saveMouseX, saveMouseY;
private JButton buttonHideToolBar;
private ArrayList<lineObject> visibleObjects = new ArrayList<lineObject>();
private MainWindow window;
private Graphics2D graphics;
private JLabel lblNewLabel;
/**
* Launch the application.
*
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
w = new MainWindow();
w.frameMalProgramm.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MainWindow() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frameMalProgramm = new JFrame();
frameMalProgramm.setTitle("MalProgramm");
frameMalProgramm.setAlwaysOnTop(true);
frameMalProgramm.setResizable(false);
frameMalProgramm.setBounds(0, 0, 1900, 1000);
frameMalProgramm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameMalProgramm.getContentPane().setLayout(null);
panelDraw = new Canvas();
panelDraw.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent arg0) {
if (!RIGHT_MOUSE_DOWN) {
paintLine(lastX, lastY, arg0.getX(), arg0.getY());
lastX = arg0.getX();
lastY = arg0.getY();
}
}
});
panelDraw.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
if (arg0.getButton() == 1) { // left click
paintLine(arg0.getX(), arg0.getY(), arg0.getX(),
arg0.getY());
lastX = arg0.getX();
lastY = arg0.getY();
}
if (arg0.getButton() == 3) // right click
{
RIGHT_MOUSE_DOWN = true;
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == 3) // right click
{
RIGHT_MOUSE_DOWN = false;
}
}
});
panelDraw.setBackground(Color.WHITE);
panelDraw.setBounds(0, 0, 4000, 4000);
panelDraw.setPreferredSize(new Dimension(4000, 4000));
// frameMalProgramm.getContentPane().add(panelDraw);
scrollPane = new JScrollPane();
scrollPane.setLocation(500, 0);
// JViewport viewport = new JViewport();
// scrollPane.setViewport(viewport);
scrollPane.setViewportView(panelDraw);
verScroll = scrollPane.getVerticalScrollBar();
horScroll = scrollPane.getHorizontalScrollBar();
verScroll.setPreferredSize(new Dimension(30, 0));
horScroll.setPreferredSize(new Dimension(0, 30));
verScroll.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
verticalScrolled(e);
}
}
);
horScroll.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
horizontalScrolled(e);
}
}
);
scrollPane
.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setSize(1750, 900);
frameMalProgramm.getContentPane().add(scrollPane);
panelTop = new JPanel();
panelTop.setBounds(0, 0, 499, 920);
frameMalProgramm.getContentPane().add(panelTop);
panelTop.setLayout(null);
sliderLineSize = new JSlider();
sliderLineSize.setFont(new Font("Tahoma", Font.BOLD, 99));
sliderLineSize
.setToolTipText("drag the button to change the line size");
sliderLineSize.setValue(5);
sliderLineSize.setMaximum(40);
sliderLineSize.setMinimum(1);
sliderLineSize.setOrientation(SwingConstants.VERTICAL);
sliderLineSize.setBounds(190, 540, 80, 360);
panelTop.add(sliderLineSize);
labelLineSize = new JLabel("5");
labelLineSize.setToolTipText("currently selected line size");
labelLineSize.setHorizontalAlignment(SwingConstants.CENTER);
labelLineSize.setFont(new Font("Tahoma", Font.PLAIN, 35));
labelLineSize.setBounds(285, 860, 70, 40);
panelTop.add(labelLineSize);
panelColorPicked = new JPanel();
panelColorPicked.setToolTipText("the currently selected colour");
panelColorPicked.setBackground(Color.BLACK);
panelColorPicked.setBounds(15, 740, 160, 160);
panelTop.add(panelColorPicked);
JButton buttonClearAll = new JButton("Alles l\u00F6schen");
buttonClearAll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeAllElements();
}
});
buttonClearAll.setToolTipText("delete all objects");
buttonClearAll.setBounds(40, 560, 100, 100);
panelTop.add(buttonClearAll);
JButton buttonColorRed = new JButton("");
buttonColorRed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
COLOR_PICKED = Color.RED;
colorChanged();
}
});
buttonColorRed.setBackground(Color.RED);
buttonColorRed.setBounds(15, 15, 100, 100);
panelTop.add(buttonColorRed);
JButton buttonColorGreen = new JButton("");
buttonColorGreen.setBackground(Color.GREEN);
buttonColorGreen.setBounds(130, 15, 100, 100);
buttonColorGreen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
COLOR_PICKED = Color.GREEN;
colorChanged();
}
});
panelTop.add(buttonColorGreen);
JButton buttonColorBlue = new JButton("");
buttonColorBlue.setBackground(Color.BLUE);
buttonColorBlue.setBounds(245, 15, 100, 100);
buttonColorBlue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
COLOR_PICKED = Color.BLUE;
colorChanged();
}
});
panelTop.add(buttonColorBlue);
JButton buttonColorBlack = new JButton("");
buttonColorBlack.setBackground(Color.BLACK);
buttonColorBlack.setBounds(15, 130, 100, 100);
buttonColorBlack.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
COLOR_PICKED = Color.BLACK;
colorChanged();
}
});
panelTop.add(buttonColorBlack);
JButton buttonChooseColor = new JButton("Farbe w\u00E4hlen");
buttonChooseColor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
COLOR_PICKED = JColorChooser.showDialog(frameMalProgramm,
"Farbe auswählen", COLOR_PICKED);
colorChanged();
}
});
buttonChooseColor.setBounds(130, 130, 100, 100);
panelTop.add(buttonChooseColor);
panelDrawShow = new JPanel();
panelDrawShow.setBackground(Color.BLACK);
panelDrawShow.setBounds(300, 800, 50, 5);
panelTop.add(panelDrawShow);
lblNewLabel = new JLabel("Farbe:");
lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 35));
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setBounds(15, 675, 160, 50);
panelTop.add(lblNewLabel);
buttonHideToolBar = new JButton("<->");
buttonHideToolBar.setBounds(400, 400, 99, 99);
panelTop.add(buttonHideToolBar);
buttonHideToolBar.setToolTipText("show / hide toolbar");
buttonHideToolBar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (TOOL_BAR_VISIBLE)
hideToolBar();
else
showToolBar();
}
});
buttonHideToolBar.setFont(new Font("Tahoma", Font.PLAIN, 15));
sliderLineSize.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
DRAW_SIZE = sliderLineSize.getValue();
panelDrawShow.setBounds(300, 800 - DRAW_SIZE, 50, DRAW_SIZE);
drawSizeChanged();
}
});
}
protected void paintLine(int x, int y, int x2, int y2) {
lineObject dot = new lineObject(x, y, x2, y2, DRAW_SIZE, COLOR_PICKED);
visibleObjects.add(dot);
paintAllObjects();
}
protected void horizontalScrolled(AdjustmentEvent e) {
// repaint?
}
protected void verticalScrolled(AdjustmentEvent e) {
// repaint?
}
protected static void removeAllElements() {
clearScreen();
paintAllObjects();
if (w.TOOL_BAR_VISIBLE) {
hideToolBar();
showToolBar();
} else {
showToolBar();
hideToolBar();
}
}
private static void clearScreen() {
w.visibleObjects.clear();
}
protected static void paintAllObjects() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
w.graphics = (Graphics2D) w.panelDraw.getGraphics();
for (lineObject l : w.visibleObjects) {
w.graphics.setColor(l.c);
w.graphics.setStroke(new BasicStroke(l.size));
w.graphics.drawLine(l.startX, l.startY, l.endX, l.endY);
}
}
});
}
private static void colorChanged() {
w.panelDrawShow.setBackground(w.COLOR_PICKED);
w.panelColorPicked.setBackground(w.COLOR_PICKED);
}
private static void drawSizeChanged() {
w.labelLineSize.setText(w.DRAW_SIZE + "");
w.sliderLineSize.setValue(w.DRAW_SIZE);
}
private static void showToolBar() {
w.TOOL_BAR_VISIBLE = true;
w.panelTop.setBounds(0, 0, 500, 900);
w.scrollPane.setSize(1350, 850);
w.scrollPane.setBounds(500, 0, 1350, 850);
w.scrollPane.updateUI();
paintAllObjects();
}
private static void hideToolBar() {
w.TOOL_BAR_VISIBLE = false;
w.panelTop.setBounds(-400, 0, 500, 900);
w.scrollPane.setSize(1750, 850);
w.scrollPane.setBounds(100, 0, 1750, 850);
w.scrollPane.updateUI();
paintAllObjects();
}
private static class lineObject {
protected int startX, startY, endX, endY, size;
protected Color c;
public lineObject(int x, int y, int x2, int y2, int size, Color c) {
this.startX = x;
this.startY = y;
this.endX = x2;
this.endY = y2;
this.size = size;
this.c = c;
}
}
public static void scrollPaneTo(int x, int z) {
w.horScroll.setValue(x);
w.verScroll.setValue(z);
}
}