Witam. Dopiero co zacząłem swoją przygodę z javą. Napisałem aplikacje gdzie na panelu mam trzy buttony. Lecz mam problem. Chciałem dodać funkcje zaznaczania. Tzn takiego jak mamy w Windowsie. Przyciskamy lewy przycisk i wraz z ruchem myszki rozciąga nam się obszar zaznaczania. I tu mam pytanie. Czy jest jakiś konkretny interfejs do tego czy muszę to robić ręcznie, tzn. wywoływać odpowiednie metody nasłuchujące i tam rysować przezroczysty prostokąt itp?
Wyjaśnienie napisałeś trochę nieprecyzyjnie...masz 3 butony na panelu i co dalej?
Chcesz jeszcze na tym panelu rysować jakieś figury?
Czy może chcesz zaznaczyć jakoś te buttony ?
Oj sorki. Chciałbym móc zaznaczać buttony. Tylko właśnie nie klikając na buttony, tylko tak jak się to robi np na pulpicie, rozciągając obszar zaznaczenia myszką.
lol ciężki orzech....
może tutaj znajdziesz coś czego szukasz...
http://download.oracle.com/javase/tutorial/uiswing/components/button.html
tam jest program który po naciśnięciu jednego0 buttona uniemożliwia naciśnięcie innych...
A odnośnie tego zaznaczania masz może jakieś pomysły?
ciężki temat....
ja bym na twoim miejscu pokombinował z mouseListenerem czyli pobierał wartości pozycji kursora i jeżeli wchodziłyby one w obszar buttona to button automatycznie by się załączał
w thinking in java jest bardzo fajny przykład :
public class Main extends JFrame {
private HashMap<String, JTextField> h =
new HashMap<String, JTextField>();
private String[] event = {
"focusGained", "focusLost", "keyPressed",
"keyReleased", "keyTyped", "mouseClicked",
"mouseEntered", "mouseExited", "mousePressed",
"mouseReleased", "mouseDragged", "mouseMoved"
};
private MyButton b1 = new MyButton(Color.BLUE, "test1"),
b2 = new MyButton(Color.RED, "test2");
class MyButton extends JButton {
void report(String field, String msg) {
h.get(field).setText(msg);
}
FocusListener fl = new FocusListener() {
public void focusGained(FocusEvent e) {
report("focusGained", e.paramString());
}
public void focusLost(FocusEvent e) {
report("focusLost", e.paramString());
}
};
KeyListener kl = new KeyListener() {
public void keyPressed(KeyEvent e) {
report("keyPressed", e.paramString());
}
public void keyReleased(KeyEvent e) {
report("keyReleased", e.paramString());
}
public void keyTyped(KeyEvent e) {
report("keyTyped", e.paramString());
}
};
MouseListener ml = new MouseListener() {
public void mouseClicked(MouseEvent e) {
report("mouseClicked", e.paramString());
}
public void mouseEntered(MouseEvent e) {
report("mouseEntered", e.paramString());
}
public void mouseExited(MouseEvent e) {
report("mouseExited", e.paramString());
}
public void mousePressed(MouseEvent e) {
report("mousePressed", e.paramString());
}
public void mouseReleased(MouseEvent e) {
report("mouseReleased", e.paramString());
}
};
MouseMotionListener mml = new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
report("mouseDragged", e.paramString());
}
public void mouseMoved(MouseEvent e) {
report("mouseMoved", e.paramString());
}
};
public MyButton(Color color, String label) {
super(label);
setBackground(color);
addFocusListener(fl);
addKeyListener(kl);
addMouseListener(ml);
addMouseMotionListener(mml);
}
}
public Main() {
setLayout(new GridLayout(event.length + 1, 2));
for (String evt : event) {
JTextField t = new JTextField();
t.setEditable(false);
add(new JLabel(evt, JLabel.RIGHT));
add(t);
h.put(evt, t);
}
add(b1);
add(b2);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame fr = new Main();
fr.setVisible(true);
fr.setSize(800, 800);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
tam masz sprawdzanie gdzie aktualnie znajduje się kursor...
Może coś w tym kierunku :)
Dzięki. Będę coś kombinował :)
Posiedziałem nad tym i udało mi się zrobić coś takiego. Ogólnie działa z jednym problemem. Podczas rysowania prostokąta znika mi button. A chciałbym żeby nie było tego widać. Ma ktoś jakiś pomysł. Oto kod:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class zaznacz extends JPanel implements MouseListener, MouseMotionListener
{
Rectangle newLine=null;
public zaznacz()
{
addMouseListener(this);
addMouseMotionListener(this);
}
static class Rectangle {
int x1,y1,x2,y2;
Rectangle(int _x1, int _y1,int _x2, int _y2){
x1=_x1;y1=_y1;x2=_x2;y2=_y2;
}
void paint(Graphics g)
{
g.drawRect(x1, y1, x2, y2);
}
}
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
startPoint=e.getPoint();
setOpaque(true);
Graphics2D g2 = (Graphics2D)getGraphics();
Rectangle2D prostokat = new Rectangle2D.Double();
prostokat.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
g2.setComposite(AlphaComposite.getInstance(rule, alpha));
g2.draw(prostokat);
g2.setColor(Color.BLUE);
g2.fill(prostokat);
}
@Override
public void mouseReleased(MouseEvent e)
{
repaint();
}
Point startPoint;
@Override
public void mouseDragged(MouseEvent e) {
setOpaque(true);
Graphics2D g2 = (Graphics2D)getGraphics();
Rectangle2D prostokat = new Rectangle2D.Double();
prostokat.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
g2.setComposite(AlphaComposite.getInstance(rule, alpha));
g2.draw(prostokat);
g2.setColor(Color.BLUE);
g2.fill(prostokat);
paint(g2);
}
@Override
public void mouseMoved(MouseEvent e) {
}
int rule = AlphaComposite.SRC_OVER;
float alpha = 0.85F;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable()
{
public void run()
{
zaznacz rys = new zaznacz();
JFrame frame = new JFrame();
JButton Button = new JButton("1");
JPanel panel = new JPanel();
panel.add(Button);
rys.add(panel);
frame.setSize(400,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setOpaque(false);
frame.add(rys);
}
});
}
}
Ma ktoś jakiś pomysł?