Commit 742429d147b36a41d70748e33329c49ac3adbb65
1 parent
2b7b8e5c
VRGNYMusicLight beginning
Showing
36 changed files
with
579 additions
and
0 deletions
Show diff stats
VRGNYMusicLights/Librairies/Linux/i686-unknown-linux-gnu/librxtxParallel.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Linux/i686-unknown-linux-gnu/librxtxSerial.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Linux/ia64-unkown-linux-gnu/librxtxSerial.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Linux/x86_64-unknown-linux-gnu/librxtxSerial.so
0 → 100644
No preview for this file type
No preview for this file type
No preview for this file type
VRGNYMusicLights/Librairies/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial-2.1-7.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial-2.1-7.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial.so
0 → 100644
No preview for this file type
VRGNYMusicLights/Librairies/Windows/i368-mingw32/README
0 → 100644
No preview for this file type
No preview for this file type
@@ -0,0 +1,57 @@ | @@ -0,0 +1,57 @@ | ||
1 | +Trent Here. I do those ugly brown pages at rxtx.org. Documentation is not | ||
2 | +what I do well :) So please help me when you see problems or something is | ||
3 | +confusing. | ||
4 | + | ||
5 | +For more information provided by end users please visit the rxtx wiki at | ||
6 | +http://rxtx.qbang.org/wiki. This is also where you can help. | ||
7 | + | ||
8 | +Short Install Instructions | ||
9 | + | ||
10 | +Windows | ||
11 | + | ||
12 | +RXTXcomm.jar goes in \jre\lib\ext (under java) | ||
13 | +rxtxSerial.dll goes in \jre\bin | ||
14 | + | ||
15 | +Mac OS X (x86 and ppc) (there is an Installer with the source) | ||
16 | + | ||
17 | +RXTXcomm.jar goes in /Library/Java/Extensions | ||
18 | +librxtxSerial.jnilib goes in /Library/Java/Extensions | ||
19 | +Run fixperm.sh thats in the directory. Fix perms is in the Mac_OS_X | ||
20 | +subdirectory. | ||
21 | + | ||
22 | +Linux (only x86, x86_64, ia64 here but more in the ToyBox) | ||
23 | + | ||
24 | +RXTXcomm.jar goes in /jre/lib/ext (under java) | ||
25 | +librxtxSerial.so goes in /jre/lib/[machine type] (i386 for instance) | ||
26 | +Make sure the user is in group lock or uucp so lockfiles work. | ||
27 | + | ||
28 | +Solaris (sparc only so far) | ||
29 | + | ||
30 | +RXTXcomm.jar goes in /jre/lib/ext (under java) | ||
31 | +librxtxSerial.so goes in /jre/lib/[machine type] | ||
32 | +Make sure the user is in group uucp so lockfiles work. | ||
33 | + | ||
34 | + | ||
35 | + | ||
36 | + | ||
37 | +A person is added to group lock or uucp by editing /etc/groups. Distributions | ||
38 | +have various tools but this works: | ||
39 | + | ||
40 | +lock:x:54: becomes: | ||
41 | +lock:x:53:jarvi,taj | ||
42 | + | ||
43 | +Now jarvi and taj are in group lock. | ||
44 | + | ||
45 | +Also make sure jarvi and taj have read and write permissions on the port. | ||
46 | + | ||
47 | + | ||
48 | + | ||
49 | + | ||
50 | +If there are problems please help each other on the wiki and ask questions | ||
51 | +on the mail-list. User contributed changes will be used here in the next | ||
52 | +release. If you don't like the documentation, you can improve it. | ||
53 | + | ||
54 | + | ||
55 | +-- | ||
56 | +Trent Jarvi | ||
57 | +tjarvi@qbang.org |
@@ -0,0 +1,68 @@ | @@ -0,0 +1,68 @@ | ||
1 | +import java.awt.event.ActionEvent; | ||
2 | +import java.awt.event.ActionListener; | ||
3 | + | ||
4 | +import javax.swing.Box; | ||
5 | +import javax.swing.BoxLayout; | ||
6 | +import javax.swing.ImageIcon; | ||
7 | +import javax.swing.JButton; | ||
8 | +import javax.swing.JPanel; | ||
9 | + | ||
10 | +public class AnimationPlayer extends JPanel implements ActionListener { | ||
11 | + private static final long serialVersionUID = 1L; | ||
12 | + | ||
13 | + private JButton backward; | ||
14 | + private JButton stop; | ||
15 | + private JButton play; | ||
16 | + private JButton pause; | ||
17 | + private JButton forward; | ||
18 | + | ||
19 | + public AnimationPlayer() { this(BoxLayout.LINE_AXIS); } | ||
20 | + public AnimationPlayer(int direction) { | ||
21 | + setLayout(new BoxLayout(this, direction)); | ||
22 | + | ||
23 | + add(Box.createHorizontalGlue()); | ||
24 | + | ||
25 | + // backward button | ||
26 | + backward = new JButton(new ImageIcon(getClass().getResource("/icons/backward.png"))); | ||
27 | + backward.addActionListener(this); | ||
28 | + add(backward); | ||
29 | + | ||
30 | + // stop button | ||
31 | + stop = new JButton(new ImageIcon(getClass().getResource("/icons/stop.png"))); | ||
32 | + stop.addActionListener(this); | ||
33 | + add(stop); | ||
34 | + | ||
35 | + // play button | ||
36 | + play = new JButton(new ImageIcon(getClass().getResource("/icons/play.png"))); | ||
37 | + play.addActionListener(this); | ||
38 | + add(play); | ||
39 | + | ||
40 | + // pause button | ||
41 | + pause = new JButton(new ImageIcon(getClass().getResource("/icons/pause.png"))); | ||
42 | + pause.addActionListener(this); | ||
43 | + add(pause); | ||
44 | + | ||
45 | + // forward button | ||
46 | + forward = new JButton(new ImageIcon(getClass().getResource("/icons/forward.png"))); | ||
47 | + forward.addActionListener(this); | ||
48 | + add(forward); | ||
49 | + | ||
50 | + add(Box.createHorizontalGlue()); | ||
51 | + } | ||
52 | + | ||
53 | + @Override | ||
54 | + public void actionPerformed(ActionEvent e) { | ||
55 | + // TODO player actions | ||
56 | + if(e.getSource() == backward) { | ||
57 | + | ||
58 | + }else if(e.getSource() == stop) { | ||
59 | + | ||
60 | + }else if(e.getSource() == play) { | ||
61 | + | ||
62 | + }else if(e.getSource() == pause) { | ||
63 | + | ||
64 | + }else if(e.getSource() == forward) { | ||
65 | + | ||
66 | + } | ||
67 | + } | ||
68 | +} |
@@ -0,0 +1,58 @@ | @@ -0,0 +1,58 @@ | ||
1 | +import java.awt.BorderLayout; | ||
2 | +import java.awt.Font; | ||
3 | +import java.awt.event.WindowAdapter; | ||
4 | +import java.awt.event.WindowEvent; | ||
5 | + | ||
6 | +import javax.swing.BoxLayout; | ||
7 | +import javax.swing.JFrame; | ||
8 | +import javax.swing.JLabel; | ||
9 | +import javax.swing.JPanel; | ||
10 | + | ||
11 | +public class Interface extends JFrame{ | ||
12 | + private static final long serialVersionUID = 1L; | ||
13 | + private static final Font titleFont = new Font(new JLabel().getFont().getName(), Font.BOLD, 14); | ||
14 | + private static final Font defaultFont = new Font(new JLabel().getFont().getName(), Font.PLAIN, new JLabel().getFont().getSize()); | ||
15 | + | ||
16 | + public Interface(final Runnable executeOnClose) { | ||
17 | + super("VRGNYMusicLights"); | ||
18 | + //this.actionList = actionList; | ||
19 | + setResizable(false); | ||
20 | + populateWindow(); | ||
21 | + pack(); | ||
22 | + setLocationRelativeTo(null); // center window | ||
23 | + | ||
24 | + addWindowListener(new WindowAdapter() { | ||
25 | + @Override | ||
26 | + public void windowClosing(WindowEvent e) { | ||
27 | + if(executeOnClose != null) | ||
28 | + executeOnClose.run(); | ||
29 | + dispose(); | ||
30 | + } | ||
31 | + }); | ||
32 | + } | ||
33 | + | ||
34 | + private void populateWindow() { | ||
35 | + JPanel mainPanel = new JPanel(new BorderLayout()); | ||
36 | + addPlayPanel(mainPanel); | ||
37 | + add(mainPanel); | ||
38 | + } | ||
39 | + | ||
40 | + private void addPlayPanel(JPanel parent) { | ||
41 | + JPanel playPanel = new JPanel(new BorderLayout()); | ||
42 | + | ||
43 | + // title | ||
44 | + JLabel title = new JLabel("Player :"); | ||
45 | + title.setFont(titleFont); | ||
46 | + playPanel.add(title, BorderLayout.NORTH); | ||
47 | + | ||
48 | + // lights | ||
49 | + playPanel.add(new LightCanvasJPanel(), BorderLayout.CENTER); | ||
50 | + | ||
51 | + // controls | ||
52 | + AnimationPlayer animPlayer = new AnimationPlayer(); | ||
53 | + animPlayer.setAlignmentX(CENTER_ALIGNMENT); | ||
54 | + playPanel.add(animPlayer, BorderLayout.SOUTH); | ||
55 | + | ||
56 | + parent.add(playPanel, BorderLayout.SOUTH); | ||
57 | + } | ||
58 | +} |
VRGNYMusicLights/Sources/InvalidPatternException.java
0 → 100644
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +import java.awt.Color; | ||
2 | +import java.awt.Dimension; | ||
3 | +import java.awt.Graphics; | ||
4 | + | ||
5 | +import javax.swing.JPanel; | ||
6 | + | ||
7 | +public class LightCanvasJPanel extends JPanel { | ||
8 | + public static final double[][] DEFAULT_LIGHT_COORDS = new double[][] { | ||
9 | + {0, 0} , {0.2, 0} , {0.4, 0} , {0.6 , 0}, {0.8, 0} , {1, 0} , | ||
10 | + {0, 0.2}, {0.2, 0.2}, {0.4, 0.2}, {0.6, 0.2}, {0.8, 0.2}, {1, 0.2}, | ||
11 | + {0, 0.4}, {0.2, 0.4}, {0.4, 0.4}, {0.6, 0.4}, {0.8, 0.4}, {1, 0.4}, | ||
12 | + {0, 0.6}, {0.2, 0.6}, {0.4, 0.6}, {0.6, 0.6}, {0.8, 0.6}, {1, 0.6}, | ||
13 | + {0, 0.8}, {0.2, 0.8}, {0.4, 0.8}, {0.6, 0.8}, {0.8, 0.8}, {1, 0.8}, | ||
14 | + {0, 1} , {0.2, 1} , {0.4, 1} , {0.6, 1} , {0.8, 1} , {1, 1} , | ||
15 | + }; | ||
16 | + | ||
17 | + private static final long serialVersionUID = 1L; | ||
18 | + private static final int WIDTH = 320; // = 300 + padding * 2 | ||
19 | + private static final int HEIGHT = 220; // = 200 + padding * 2 | ||
20 | + private static final int LIGHT_RADIUS = 4; | ||
21 | + private static final int PADDING = 10; | ||
22 | + private double[][] lightsCoords; | ||
23 | + | ||
24 | + /** | ||
25 | + * @param lightCoords : double[LightID][X = 0, Y = 1] = coordinates as a percentage [0, 1] | ||
26 | + */ | ||
27 | + public LightCanvasJPanel() {this(DEFAULT_LIGHT_COORDS);} | ||
28 | + public LightCanvasJPanel(double[][] lightsCoords) { | ||
29 | + this.lightsCoords = lightsCoords; | ||
30 | + setPreferredSize(new Dimension(WIDTH, HEIGHT)); | ||
31 | + } | ||
32 | + | ||
33 | + @Override | ||
34 | + protected void paintComponent(Graphics g) { | ||
35 | + // background | ||
36 | + g.setColor(Color.WHITE); | ||
37 | + g.fillRect(0, 0, WIDTH, HEIGHT); | ||
38 | + | ||
39 | + // lights | ||
40 | + if(lightsCoords == null) return; | ||
41 | + g.setColor(Color.BLACK); | ||
42 | + for(double[] light : lightsCoords) { | ||
43 | + if(light.length != 2) | ||
44 | + throw new MalformedCoordinates(); | ||
45 | + int centerX = (int) (light[0] * (WIDTH - PADDING * 2)) + PADDING; | ||
46 | + int centerY = (int) (light[1] * (HEIGHT - PADDING * 2)) + PADDING; | ||
47 | + | ||
48 | + g.fillOval(centerX - LIGHT_RADIUS, centerY - LIGHT_RADIUS, LIGHT_RADIUS * 2, LIGHT_RADIUS * 2); | ||
49 | + } | ||
50 | + } | ||
51 | +} |
@@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
1 | + | ||
2 | +/* TODO list : | ||
3 | + * - keyboard listener for animation player (play / pause = space, forward = semicolon, backward = comma, stop = backspace) | ||
4 | + */ | ||
5 | +public class Main { | ||
6 | + public static void main(String[] args) throws InterruptedException { | ||
7 | + /* FIXME interface testing in progress | ||
8 | + | ||
9 | + String serialPort = null; | ||
10 | + try { | ||
11 | + serialPort = SerialPortChooserDialog.showSerialPortChooserDialog(); | ||
12 | + } catch (NoSerialPortException e) { | ||
13 | + JOptionPane.showMessageDialog(null, "No serial port available !", "Error", JOptionPane.ERROR_MESSAGE); | ||
14 | + System.exit(-1); | ||
15 | + } | ||
16 | + if(serialPort == null) System.exit(-1); | ||
17 | + | ||
18 | + final SerialCom serialCom = new SerialCom(serialPort); | ||
19 | + // arduino need time before accepting serial data | ||
20 | + Thread.sleep(1000);*/ | ||
21 | + | ||
22 | + Interface i = new Interface(new Runnable() { | ||
23 | + @Override | ||
24 | + public void run() { | ||
25 | + //serialCom.close(); | ||
26 | + } | ||
27 | + }); | ||
28 | + i.setVisible(true); | ||
29 | + } | ||
30 | +} |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | + | ||
2 | +public class Music { | ||
3 | + private MusicPattern pattern; | ||
4 | + private MusicPath path; | ||
5 | + private long startDelai; // in ms | ||
6 | + private long length; // in ms | ||
7 | + | ||
8 | + public Music(MusicPattern pattern, MusicPath path, long startDelai, long length) { | ||
9 | + this.pattern = pattern; | ||
10 | + this.path = path; | ||
11 | + this.startDelai = startDelai; | ||
12 | + this.length = length; | ||
13 | + | ||
14 | + //call MusicPath transform() | ||
15 | + } | ||
16 | +} |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | + | ||
2 | +public class MusicPath { | ||
3 | + private static final int VERTICAL_DOWN = 0; | ||
4 | + private static final int VERTICAL_UP = 1; | ||
5 | + private static final int HORIZONTAL_DOWN = 2; | ||
6 | + private static final int HORIZONTAL_UP = 3; | ||
7 | + private static final int DIAGONAL_TOP_RIGHT_DOWN_LEFT = 4; | ||
8 | + private static final int DIAGONAL_TOP_LEFT_DOWN_RIGHT = 5; | ||
9 | + private static final int CENTER_OUT = 6; | ||
10 | + private static final int CENTER_IN = 7; | ||
11 | + | ||
12 | + private int animation; | ||
13 | + | ||
14 | + public MusicPath(int animation) { | ||
15 | + this.animation = animation; | ||
16 | + } | ||
17 | + | ||
18 | + // TODO transform music according to animation | ||
19 | + // what format ? int[nled][pattern] (ms) ? | ||
20 | +} |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | + | ||
2 | +public class MusicPattern { | ||
3 | + /* Pattern definition : | ||
4 | + * 0 : low time | ||
5 | + * 1 : rise time | ||
6 | + * 2 : high time | ||
7 | + * 3 : fall time | ||
8 | + */ | ||
9 | + private int[] pattern; // in ms | ||
10 | + | ||
11 | + public MusicPattern(int[] pattern) { | ||
12 | + if(pattern.length != 4) | ||
13 | + throw new InvalidPatternException(); | ||
14 | + this.pattern = pattern; | ||
15 | + } | ||
16 | +} |
VRGNYMusicLights/Sources/NoSerialPortException.java
0 → 100644
@@ -0,0 +1,82 @@ | @@ -0,0 +1,82 @@ | ||
1 | +import java.io.IOException; | ||
2 | +import java.io.InputStream; | ||
3 | +import java.io.OutputStream; | ||
4 | +import java.util.Enumeration; | ||
5 | + | ||
6 | +import gnu.io.CommPortIdentifier; | ||
7 | +import gnu.io.PortInUseException; | ||
8 | +import gnu.io.SerialPort; | ||
9 | +import gnu.io.UnsupportedCommOperationException; | ||
10 | + | ||
11 | +public class SerialCom { | ||
12 | + private static final int DATA_RATE = 9600; | ||
13 | + private static final int TIME_OUT = 2000; | ||
14 | + private static final int BUFFER_SIZE = 1024; | ||
15 | + | ||
16 | + private SerialPort serialPort; | ||
17 | + private InputStream input; | ||
18 | + private OutputStream output; | ||
19 | + | ||
20 | + public SerialCom(int portNumberWindows) { this("COM" + String.valueOf(portNumberWindows)); } | ||
21 | + public SerialCom(String portName) { | ||
22 | + CommPortIdentifier portId = null; | ||
23 | + Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers(); | ||
24 | + | ||
25 | + // Search for serial port | ||
26 | + while (portEnum.hasMoreElements()) { | ||
27 | + CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); | ||
28 | + if (currPortId.getName().equals(portName)) { | ||
29 | + portId = currPortId; | ||
30 | + break; | ||
31 | + } | ||
32 | + } | ||
33 | + if (portId == null) | ||
34 | + throw new SerialComPortException(portName); | ||
35 | + | ||
36 | + // open connection | ||
37 | + try { | ||
38 | + serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); | ||
39 | + serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); | ||
40 | + | ||
41 | + input = serialPort.getInputStream(); | ||
42 | + output = serialPort.getOutputStream(); | ||
43 | + } catch (IOException | ||
44 | + | UnsupportedCommOperationException | ||
45 | + | PortInUseException e) { | ||
46 | + throw new SerialComPortException(portName); | ||
47 | + } | ||
48 | + } | ||
49 | + | ||
50 | + public void close() { | ||
51 | + try { | ||
52 | + input.close(); | ||
53 | + output.close(); | ||
54 | + } catch (IOException e) { | ||
55 | + e.printStackTrace(); | ||
56 | + } | ||
57 | + serialPort.removeEventListener(); | ||
58 | + serialPort.close(); | ||
59 | + } | ||
60 | + public void send(byte[] bytes) { | ||
61 | + try { | ||
62 | + this.output.write(bytes); | ||
63 | + } catch (IOException e) { | ||
64 | + e.printStackTrace(); | ||
65 | + } | ||
66 | + } | ||
67 | + | ||
68 | + public byte[] recieve() { | ||
69 | + byte[] buffer = new byte[BUFFER_SIZE]; | ||
70 | + int len = -1; | ||
71 | + | ||
72 | + try { len = this.input.read(buffer); } | ||
73 | + catch (IOException e) { return null; } | ||
74 | + | ||
75 | + if(len == -1 || len == 0) | ||
76 | + return null; | ||
77 | + byte[] data = new byte[len]; | ||
78 | + for(int i=0; i<len; i++) | ||
79 | + data[i] = buffer[i]; | ||
80 | + return data; | ||
81 | + } | ||
82 | +} |
VRGNYMusicLights/Sources/SerialComPortException.java
0 → 100644
VRGNYMusicLights/Sources/SerialComWrongCallbackMethod.java
0 → 100644
VRGNYMusicLights/Sources/SerialPortChooserDialog.java
0 → 100644
@@ -0,0 +1,119 @@ | @@ -0,0 +1,119 @@ | ||
1 | +import java.awt.BorderLayout; | ||
2 | +import java.awt.Dimension; | ||
3 | +import java.awt.FlowLayout; | ||
4 | +import java.awt.event.ActionEvent; | ||
5 | +import java.awt.event.ActionListener; | ||
6 | +import java.util.ArrayList; | ||
7 | +import java.util.Enumeration; | ||
8 | + | ||
9 | +import javax.swing.DefaultListModel; | ||
10 | +import javax.swing.JButton; | ||
11 | +import javax.swing.JDialog; | ||
12 | +import javax.swing.JLabel; | ||
13 | +import javax.swing.JList; | ||
14 | +import javax.swing.JPanel; | ||
15 | +import javax.swing.JScrollPane; | ||
16 | +import javax.swing.ListSelectionModel; | ||
17 | +import javax.swing.event.ListSelectionEvent; | ||
18 | +import javax.swing.event.ListSelectionListener; | ||
19 | + | ||
20 | +import gnu.io.CommPortIdentifier; | ||
21 | + | ||
22 | +public class SerialPortChooserDialog extends JDialog implements ActionListener, ListSelectionListener { | ||
23 | + private static final long serialVersionUID = 1L; | ||
24 | + | ||
25 | + private boolean onlyOneChoice; | ||
26 | + private boolean emptyChoice; | ||
27 | + private ArrayList<String> portNames; | ||
28 | + private String choosedPort = null; | ||
29 | + | ||
30 | + private JList<String> list; | ||
31 | + private JButton ok; | ||
32 | + private JButton cancel; | ||
33 | + | ||
34 | + private SerialPortChooserDialog() { | ||
35 | + Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers(); | ||
36 | + portNames = new ArrayList<>(); | ||
37 | + | ||
38 | + while (portEnum.hasMoreElements()) { | ||
39 | + CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); | ||
40 | + portNames.add(currPortId.getName()); | ||
41 | + } | ||
42 | + | ||
43 | + onlyOneChoice = portNames.size() <= 1; | ||
44 | + emptyChoice = portNames.size() == 0; | ||
45 | + if(onlyOneChoice || emptyChoice) | ||
46 | + return; | ||
47 | + | ||
48 | + // JDialog creation | ||
49 | + JPanel mainPanel = new JPanel(new BorderLayout()); | ||
50 | + setModal(true); | ||
51 | + setTitle("Serial port chooser"); | ||
52 | + | ||
53 | + // title | ||
54 | + mainPanel.add(new JLabel("Choose a serial port : "), BorderLayout.NORTH); | ||
55 | + | ||
56 | + // list ports | ||
57 | + DefaultListModel<String> listModel = new DefaultListModel<>(); | ||
58 | + for(String str : portNames) | ||
59 | + listModel.addElement(str); | ||
60 | + list = new JList<>(listModel); | ||
61 | + list.addListSelectionListener(this); | ||
62 | + list.setVisibleRowCount(3); | ||
63 | + list.setLayoutOrientation(JList.VERTICAL); | ||
64 | + list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); | ||
65 | + | ||
66 | + JScrollPane scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); | ||
67 | + scrollPane.setPreferredSize(new Dimension(200, 100)); | ||
68 | + mainPanel.add(scrollPane, BorderLayout.CENTER); | ||
69 | + | ||
70 | + // buttons ok / cancel | ||
71 | + JPanel borderLayoutPanel = new JPanel(new BorderLayout()); | ||
72 | + JPanel buttonsLayout = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 3)); | ||
73 | + ok = new JButton("Ok"); | ||
74 | + cancel = new JButton("Cancel"); | ||
75 | + ok.addActionListener(this); | ||
76 | + cancel.addActionListener(this); | ||
77 | + ok.setEnabled(false); | ||
78 | + buttonsLayout.add(cancel); | ||
79 | + buttonsLayout.add(ok); | ||
80 | + borderLayoutPanel.add(buttonsLayout, BorderLayout.EAST); | ||
81 | + mainPanel.add(borderLayoutPanel, BorderLayout.SOUTH); | ||
82 | + | ||
83 | + // padding | ||
84 | + JPanel padding = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5)); | ||
85 | + padding.add(mainPanel); | ||
86 | + add(padding); | ||
87 | + | ||
88 | + setResizable(false); | ||
89 | + pack(); | ||
90 | + setLocationRelativeTo(null); | ||
91 | + setVisible(true); | ||
92 | + } | ||
93 | + | ||
94 | + public static String showSerialPortChooserDialog() throws NoSerialPortException { | ||
95 | + SerialPortChooserDialog dialog = new SerialPortChooserDialog(); | ||
96 | + if(dialog.emptyChoice) | ||
97 | + throw new NoSerialPortException(); | ||
98 | + if(dialog.onlyOneChoice) | ||
99 | + return dialog.portNames.get(0); | ||
100 | + return dialog.choosedPort; | ||
101 | + } | ||
102 | + | ||
103 | + @Override | ||
104 | + public void actionPerformed(ActionEvent e) { | ||
105 | + if(e.getSource() == ok) { | ||
106 | + choosedPort = list.getSelectedValue(); | ||
107 | + dispose(); | ||
108 | + } else if(e.getSource() == cancel) { | ||
109 | + dispose(); | ||
110 | + } | ||
111 | + } | ||
112 | + | ||
113 | + @Override | ||
114 | + public void valueChanged(ListSelectionEvent e) { | ||
115 | + if(e.getSource() == list) { | ||
116 | + ok.setEnabled(list.getSelectedIndex() != -1); | ||
117 | + } | ||
118 | + } | ||
119 | +} |
436 Bytes
412 Bytes
295 Bytes
364 Bytes
320 Bytes