diff --git a/pom.xml b/pom.xml
index 324202e..aa8a9df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,17 @@
6.0.0
test
+
+ net.bytebuddy
+ byte-buddy
+ 1.18.4
+
+
+ org.jetbrains
+ annotations
+ 26.0.2
+ compile
+
\ No newline at end of file
diff --git a/src/main/java/org/openautonomousconnection/oacswing/JAnimatedComponent.java b/src/main/java/org/openautonomousconnection/oacswing/JAnimatedComponent.java
deleted file mode 100644
index e12ef8b..0000000
--- a/src/main/java/org/openautonomousconnection/oacswing/JAnimatedComponent.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.openautonomousconnection.oacswing;
-
-public interface JAnimatedComponent {
- void play(double speed, boolean loop);
-
- default void play(double speed) {
- this.play(speed, false);
- }
-
- default void play() {
- this.play(1, false);
- }
-
- void stop();
-}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/JTitledComponent.java b/src/main/java/org/openautonomousconnection/oacswing/JTitledComponent.java
deleted file mode 100644
index 510ac63..0000000
--- a/src/main/java/org/openautonomousconnection/oacswing/JTitledComponent.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.openautonomousconnection.oacswing;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.swing.*;
-import java.awt.*;
-
-public class JTitledComponent extends JPanel {
- @Getter @Setter
- private JLabel title;
-
- @Getter @Setter
- private C component;
-
- public JTitledComponent(String title, C component) {
- this.setLayout(new FlowLayout());
-
- this.title = new JLabel(title);
-
- this.component = component;
-
- this.add(this.title);
- this.add(this.component);
- }
-}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/ModifiableImageIcon.java b/src/main/java/org/openautonomousconnection/oacswing/ModifiableImageIcon.java
new file mode 100644
index 0000000..917ab80
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/ModifiableImageIcon.java
@@ -0,0 +1,96 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing;
+
+import org.openautonomousconnection.oacswing.icons.IconSize;
+
+import javax.swing.*;
+import java.awt.*;
+import java.net.URL;
+
+/**
+ * Image icon with several (planned) modification methods, like resize(x, y)
+ */
+public class ModifiableImageIcon extends ImageIcon {
+ public ModifiableImageIcon(String filename, String description) {
+ super(filename, description);
+ }
+
+ public ModifiableImageIcon(String filename) {
+ super(filename);
+ }
+
+ public ModifiableImageIcon(URL location, String description) {
+ super(location, description);
+ }
+
+ public ModifiableImageIcon(URL location) {
+ super(location);
+ }
+
+ public ModifiableImageIcon(Image image, String description) {
+ super(image, description);
+ }
+
+ public ModifiableImageIcon(Image image) {
+ super(image);
+ }
+
+ public ModifiableImageIcon(byte[] imageData, String description) {
+ super(imageData, description);
+ }
+
+ public ModifiableImageIcon(byte[] imageData) {
+ super(imageData);
+ }
+
+ public ModifiableImageIcon() {
+ super();
+ }
+
+ public ModifiableImageIcon ofSize(IconSize iconSize, int hints) {
+ return this.ofSize(iconSize.getScale(), iconSize.getScale(), hints);
+ }
+
+ public ModifiableImageIcon ofSize(IconSize iconSize) {
+ return this.ofSize(iconSize.getScale(), iconSize.getScale());
+ }
+
+ public ModifiableImageIcon ofSize(int newWidth, int newHeight) {
+ return this.ofSize(newWidth, newHeight, Image.SCALE_SMOOTH);
+ }
+
+ public ModifiableImageIcon ofSize(int newWidth, int newHeight, int hints) {
+ ModifiableImageIcon icon = this.clone();
+
+ icon.resize(newWidth, newHeight, hints);
+
+ return icon;
+ }
+
+ public void resize(int newWidth, int newHeight) {
+ this.resize(newWidth, newHeight, Image.SCALE_SMOOTH);
+ }
+
+ public void resize(int newWidth, int newHeight, int hints) {
+ Image image = this.getImage();
+
+ this.setImage(image.getScaledInstance(newWidth, newHeight, hints));
+ }
+
+ public void resize(IconSize iconSize) {
+ this.resize(iconSize.getScale(), iconSize.getScale());
+ }
+
+ public void resize(IconSize iconSize, int hints) {
+ this.resize(iconSize.getScale(), iconSize.getScale(), hints);
+ }
+
+ @Override
+ public ModifiableImageIcon clone() {
+ return new ModifiableImageIcon(this.getImage(), this.getDescription());
+ }
+
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/animated/AnimatedComponent.java b/src/main/java/org/openautonomousconnection/oacswing/animated/AnimatedComponent.java
new file mode 100644
index 0000000..5061724
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/animated/AnimatedComponent.java
@@ -0,0 +1,62 @@
+/* Author: Maple
+ * Jan. 23 2026
+ * */
+
+package org.openautonomousconnection.oacswing.animated;
+
+import javax.swing.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public interface AnimatedComponent {
+ void setCurrentRun(Timer timer);
+ Timer getCurrentRun();
+
+ void setAnimationPath(AnimationPath animationPath);
+ AnimationPath getAnimationPath();
+
+ void setBounds(int x, int y, int width, int height);
+
+ default void play(double speed, boolean loop) {
+ AtomicInteger ticksPassed = new AtomicInteger();
+
+ this.setCurrentRun(new Timer(0, e -> {
+
+ if(ticksPassed.get() * speed / (100) < 1) {
+ ticksPassed.addAndGet(this.getAnimationPath().getInbetweens());
+ return;
+ }
+
+ KeyFrame next = this.getAnimationPath().getNext();
+
+ if(next == null) {
+ if(loop)
+ this.getAnimationPath().reset();
+ else
+ ((Timer) e.getSource()).stop();
+ return;
+ }
+
+ this.setBounds(next.position().x, next.position().y, next.width(), next.height());
+
+ ticksPassed.set(0);
+ }));
+
+ this.getCurrentRun().start();
+ }
+
+ default void play(double speed) {
+ this.play(speed, false);
+ }
+
+ default void play() {
+ this.play(1, false);
+ }
+
+ default void stop() {
+ if(this.getCurrentRun() != null)
+ if(this.getCurrentRun().isRunning())
+ this.getCurrentRun().stop();
+
+ this.getAnimationPath().reset();
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/animated/AnimationPath.java b/src/main/java/org/openautonomousconnection/oacswing/animated/AnimationPath.java
index 5fb90a2..db9c37c 100644
--- a/src/main/java/org/openautonomousconnection/oacswing/animated/AnimationPath.java
+++ b/src/main/java/org/openautonomousconnection/oacswing/animated/AnimationPath.java
@@ -1,3 +1,7 @@
+/* Author: Maple
+ * Jan. 24 2026
+ * */
+
package org.openautonomousconnection.oacswing.animated;
import lombok.Getter;
diff --git a/src/main/java/org/openautonomousconnection/oacswing/animated/JAnimatedPanel.java b/src/main/java/org/openautonomousconnection/oacswing/animated/JAnimatedPanel.java
index fc016c9..5ad2f35 100644
--- a/src/main/java/org/openautonomousconnection/oacswing/animated/JAnimatedPanel.java
+++ b/src/main/java/org/openautonomousconnection/oacswing/animated/JAnimatedPanel.java
@@ -1,56 +1,22 @@
+/* Author: Maple
+ * Jan. 23 2026
+ * */
+
package org.openautonomousconnection.oacswing.animated;
import lombok.Getter;
import lombok.Setter;
-import org.openautonomousconnection.oacswing.JAnimatedComponent;
import javax.swing.*;
-import java.util.concurrent.atomic.AtomicInteger;
-public class JAnimatedPanel extends JPanel implements JAnimatedComponent {
+public class JAnimatedPanel extends JPanel implements AnimatedComponent {
@Getter @Setter
private AnimationPath animationPath;
+ @Getter @Setter
private Timer currentRun = null;
public JAnimatedPanel(AnimationPath animationPath) {
this.animationPath = animationPath;
}
-
-
- @Override
- public void play(double speed, boolean loop) {
-
- AtomicInteger ticksPassed = new AtomicInteger();
-
- this.currentRun = new Timer(0, e -> {
-
- if(ticksPassed.get() * speed / (100) < 1) {
- ticksPassed.addAndGet(animationPath.getInbetweens());
- return;
- }
-
- KeyFrame next = animationPath.getNext();
-
- if(next == null) {
- ((Timer) e.getSource()).stop();
- return;
- }
-
- setBounds(next.position().x, next.position().y, next.width(), next.height());
-
- ticksPassed.set(0);
- });
-
- this.currentRun.start();
- }
-
- @Override
- public void stop() {
- if(this.currentRun != null)
- if(this.currentRun.isRunning())
- this.currentRun.stop();
-
- this.animationPath.reset();
- }
}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/animated/KeyFrame.java b/src/main/java/org/openautonomousconnection/oacswing/animated/KeyFrame.java
index 87ab3f3..ee0ed6e 100644
--- a/src/main/java/org/openautonomousconnection/oacswing/animated/KeyFrame.java
+++ b/src/main/java/org/openautonomousconnection/oacswing/animated/KeyFrame.java
@@ -1,3 +1,7 @@
+/* Author: Maple
+ * Jan. 24 2026
+ * */
+
package org.openautonomousconnection.oacswing.animated;
import javax.swing.*;
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACAnimatedPanel.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACAnimatedPanel.java
new file mode 100644
index 0000000..b04dfee
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACAnimatedPanel.java
@@ -0,0 +1,25 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.openautonomousconnection.oacswing.animated.AnimatedComponent;
+import org.openautonomousconnection.oacswing.animated.AnimationPath;
+
+import javax.swing.*;
+
+public class OACAnimatedPanel extends OACPanel implements AnimatedComponent {
+ @Getter
+ @Setter
+ private AnimationPath animationPath;
+
+ @Getter @Setter
+ private Timer currentRun = null;
+
+ public OACAnimatedPanel(AnimationPath animationPath) {
+ this.animationPath = animationPath;
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java
new file mode 100644
index 0000000..7726528
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java
@@ -0,0 +1,65 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+import org.openautonomousconnection.oacswing.component.design.Design;
+
+import javax.swing.*;
+import java.awt.*;
+import java.beans.ConstructorProperties;
+
+public class OACButton extends JButton implements OACComponent {
+ public OACButton() {
+ super(null, null);
+ }
+
+ public OACButton(Design design, Icon icon) {
+ super(null, icon);
+ }
+
+ @ConstructorProperties({"text"})
+ public OACButton(String text) {
+ super(text, null);
+ }
+
+ public OACButton(Action a) {
+ super(a);
+ }
+
+ public OACButton(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java
new file mode 100644
index 0000000..f088402
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java
@@ -0,0 +1,69 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACCheckBox extends JCheckBox implements OACComponent {
+ public OACCheckBox() {
+ super();
+ }
+
+ public OACCheckBox(Icon icon) {
+ super(icon);
+ }
+
+ public OACCheckBox(Icon icon, boolean selected) {
+ super(icon, selected);
+ }
+
+ public OACCheckBox(String text) {
+ super(text);
+ }
+
+ public OACCheckBox(Action a) {
+ super(a);
+ }
+
+ public OACCheckBox(String text, boolean selected) {
+ super(text, selected);
+ }
+
+ public OACCheckBox(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACCheckBox(String text, Icon icon, boolean selected) {
+ super(text, icon, selected);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ return OACComponent.super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ return OACComponent.super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ OACComponent.super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ return OACComponent.super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ OACComponent.super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java
new file mode 100644
index 0000000..21dafa3
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java
@@ -0,0 +1,65 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACCheckBoxMenuItem extends JCheckBoxMenuItem implements OACComponent {
+ public OACCheckBoxMenuItem() {
+ super();
+ }
+
+ public OACCheckBoxMenuItem(Icon icon) {
+ super(icon);
+ }
+
+ public OACCheckBoxMenuItem(String text) {
+ super(text);
+ }
+
+ public OACCheckBoxMenuItem(Action a) {
+ super(a);
+ }
+
+ public OACCheckBoxMenuItem(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACCheckBoxMenuItem(String text, boolean b) {
+ super(text, b);
+ }
+
+ public OACCheckBoxMenuItem(String text, Icon icon, boolean b) {
+ super(text, icon, b);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ return OACComponent.super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ return OACComponent.super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ OACComponent.super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ return OACComponent.super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ OACComponent.super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java
new file mode 100644
index 0000000..0729043
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java
@@ -0,0 +1,37 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACColorChooser extends JColorChooser implements OACComponent {
+ @Override
+ public Component add(Component comp) {
+ return OACComponent.super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ return OACComponent.super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ OACComponent.super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ return OACComponent.super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ OACComponent.super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java
new file mode 100644
index 0000000..c40bb0b
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java
@@ -0,0 +1,54 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Vector;
+
+public class OACComboBox extends JComboBox implements OACComponent {
+ public OACComboBox(ComboBoxModel aModel) {
+ super(aModel);
+ }
+
+ public OACComboBox(E[] items) {
+ super(items);
+ }
+
+ public OACComboBox(Vector items) {
+ super(items);
+ }
+
+ public OACComboBox() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ return OACComponent.super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ return OACComponent.super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ OACComponent.super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ return OACComponent.super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ OACComponent.super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java
new file mode 100644
index 0000000..6e9084a
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java
@@ -0,0 +1,106 @@
+package org.openautonomousconnection.oacswing.component;
+
+import jdk.jshell.spi.ExecutionControl;
+import org.jetbrains.annotations.Nullable;
+import org.openautonomousconnection.oacswing.component.design.Design;
+import org.openautonomousconnection.oacswing.component.design.DesignManager;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Optional;
+import java.util.OptionalInt;
+
+public interface OACComponent {
+ default void initDesign() {
+ DesignManager.apply(this);
+// Design design = DesignManager.getGlobalDesign();
+//
+// this.setBackground(design.getElements().get(this.getClass()).getColor());
+ }
+
+ void setBackground(Color color);
+
+ default void initOther(Component comp) {
+ if(comp instanceof OACComponent component)
+ component.initDesign();
+ }
+
+ default @Nullable Component add(Optional name, Component comp, OptionalInt index, Optional> constrains) throws ExecutionControl.NotImplementedException {
+ JComponent superclass = this.getSuperclass();
+
+ if(comp instanceof OACComponent component)
+ component.initDesign();
+
+ if(name.isPresent())
+ return superclass.add(name.get(), comp);
+ else if(constrains.isPresent())
+ if(index.isPresent()) {
+ superclass.add(comp, constrains.get(), index.getAsInt());
+ return null;
+ }
+ else {
+ superclass.add(comp, constrains.get());
+ return null;
+ }
+
+ else if(index.isPresent())
+ return superclass.add(comp, index.getAsInt());
+
+ else
+ return superclass.add(comp);
+ }
+
+ default Component add(Component comp) {
+ try {
+ return this.add(Optional.empty(), comp, OptionalInt.empty(), Optional.empty());
+ } catch (ExecutionControl.NotImplementedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ default Component add(String name, Component comp) {
+ try {
+ return this.add(Optional.of(name), comp, OptionalInt.empty(), Optional.empty());
+ } catch (ExecutionControl.NotImplementedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ default Component add(Component comp, int index) {
+ try {
+ return this.add(Optional.empty(), comp, OptionalInt.of(index), Optional.empty());
+ } catch (ExecutionControl.NotImplementedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ default void add(Component comp, Object constraints, int index) {
+ try {
+ this.add(Optional.empty(), comp, OptionalInt.of(index), Optional.of(constraints));
+ } catch (ExecutionControl.NotImplementedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ default void add(Component comp, Object constraints) {
+ try {
+ this.add(Optional.empty(), comp, OptionalInt.empty(), Optional.of(constraints));
+ } catch (ExecutionControl.NotImplementedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Needed to run JComponent / Component methods
+ * @return JComponent type superclass
+ * @throws ExecutionControl.NotImplementedException superclass is not of type JComponent
+ */
+ default JComponent getSuperclass() throws ExecutionControl.NotImplementedException {
+ if(this instanceof JComponent superClass)
+ return superClass;
+ else
+ throw new ExecutionControl.NotImplementedException("Trying to implement OACComponent interface for non-JComponent class");
+
+ }
+
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java
new file mode 100644
index 0000000..f56cfe3
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java
@@ -0,0 +1,105 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+import org.openautonomousconnection.oacswing.component.design.DesignManager;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.geom.RoundRectangle2D;
+
+public class OACFrame extends JFrame {
+ public OACFrame() {
+ super();
+
+ this.init();
+ }
+
+ private void initIfOACComponent(Component comp) {
+ if(comp instanceof OACComponent component)
+ component.initDesign();
+ }
+
+ @Override
+ protected OACRootPane createRootPane() {
+ OACRootPane rp = new OACRootPane();
+
+ rp.setOpaque(true);
+ return rp;
+ }
+
+ @Override
+ public OACRootPane getRootPane() {
+ return (OACRootPane) this.rootPane;
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initIfOACComponent(comp);
+
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initIfOACComponent(comp);
+
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initIfOACComponent(comp);
+
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initIfOACComponent(comp);
+
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initIfOACComponent(comp);
+
+ super.add(comp, constraints, index);
+ }
+
+ public OACFrame(GraphicsConfiguration gc) {
+ super(gc);
+
+ this.init();
+ }
+
+ public OACFrame(String title) {
+ super(title);
+
+ this.init();
+ }
+
+ public OACFrame(String title, GraphicsConfiguration gc) {
+ super(title, gc);
+
+ this.init();
+ }
+
+ private void init() {
+ this.setUndecorated(true);
+
+// DesignManager.apply(this.getRootPane());
+ DesignManager.apply(this);
+ this.setShape(new RoundRectangle2D.Double(
+ 0, 0,
+ this.getWidth(),
+ this.getHeight(),
+ 30, 30
+ ));
+
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACLabel.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACLabel.java
new file mode 100644
index 0000000..556f83b
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACLabel.java
@@ -0,0 +1,33 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import javax.swing.*;
+
+public class OACLabel extends JLabel implements OACComponent {
+ public OACLabel(String text, Icon icon, int horizontalAlignment) {
+ super(text, icon, horizontalAlignment);
+ }
+
+ public OACLabel(String text, int horizontalAlignment) {
+ super(text, null, horizontalAlignment);
+ }
+
+ public OACLabel(String text) {
+ super(text, null, LEADING);
+ }
+
+ public OACLabel(Icon image, int horizontalAlignment) {
+ super(null, image, horizontalAlignment);
+ }
+
+ public OACLabel(Icon image) {
+ super(null, image, CENTER);
+ }
+
+ public OACLabel() {
+ super("", null, LEADING);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java
new file mode 100644
index 0000000..6c62596
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java
@@ -0,0 +1,46 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACLayeredPane extends JLayeredPane implements OACComponent {
+ public OACLayeredPane() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java
new file mode 100644
index 0000000..f8bcd1f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java
@@ -0,0 +1,59 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Vector;
+
+public class OACList extends JList implements OACComponent {
+ public OACList(ListModel dataModel) {
+ super(dataModel);
+ }
+
+ public OACList(E[] listData) {
+ super(listData);
+ }
+
+ public OACList(Vector extends E> listData) {
+ super(listData);
+ }
+
+ public OACList() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java
new file mode 100644
index 0000000..13c86fa
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java
@@ -0,0 +1,58 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACMenu extends JMenu implements OACComponent {
+ public OACMenu() {
+ super();
+ }
+
+ public OACMenu(String s) {
+ super(s);
+ }
+
+ public OACMenu(Action a) {
+ super(a);
+ }
+
+ public OACMenu(String s, boolean b) {
+ super(s, b);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java
new file mode 100644
index 0000000..eb82df9
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java
@@ -0,0 +1,46 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACMenuBar extends JMenuBar implements OACComponent {
+ public OACMenuBar() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java
new file mode 100644
index 0000000..19ecd81
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java
@@ -0,0 +1,66 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACMenuItem extends JMenuItem implements OACComponent {
+ public OACMenuItem() {
+ super();
+ }
+
+ public OACMenuItem(Icon icon) {
+ super(icon);
+ }
+
+ public OACMenuItem(String text) {
+ super(text);
+ }
+
+ public OACMenuItem(Action a) {
+ super(a);
+ }
+
+ public OACMenuItem(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACMenuItem(String text, int mnemonic) {
+ super(text, mnemonic);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java
new file mode 100644
index 0000000..abfa499
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java
@@ -0,0 +1,70 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACOptionPane extends JOptionPane implements OACComponent {
+ public OACOptionPane() {
+ super();
+ }
+
+ public OACOptionPane(Object message) {
+ super(message);
+ }
+
+ public OACOptionPane(Object message, int messageType) {
+ super(message, messageType);
+ }
+
+ public OACOptionPane(Object message, int messageType, int optionType) {
+ super(message, messageType, optionType);
+ }
+
+ public OACOptionPane(Object message, int messageType, int optionType, Icon icon) {
+ super(message, messageType, optionType, icon);
+ }
+
+ public OACOptionPane(Object message, int messageType, int optionType, Icon icon, Object[] options) {
+ super(message, messageType, optionType, icon, options);
+ }
+
+ public OACOptionPane(Object message, int messageType, int optionType, Icon icon, Object[] options, Object initialValue) {
+ super(message, messageType, optionType, icon, options, initialValue);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java
new file mode 100644
index 0000000..861b015
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java
@@ -0,0 +1,58 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACPanel extends JPanel implements OACComponent {
+ public OACPanel(LayoutManager layout, boolean isDoubleBuffered) {
+ super(layout, isDoubleBuffered);
+ }
+
+ public OACPanel(LayoutManager layout) {
+ super(layout);
+ }
+
+ public OACPanel(boolean isDoubleBuffered) {
+ super(isDoubleBuffered);
+ }
+
+ public OACPanel() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java
new file mode 100644
index 0000000..56ed836
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java
@@ -0,0 +1,63 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.text.Document;
+import java.awt.*;
+
+public class OACPasswordField extends JPasswordField implements OACComponent {
+ public OACPasswordField() {
+ super();
+ }
+
+ public OACPasswordField(String text) {
+ super(text);
+ }
+
+ public OACPasswordField(int columns) {
+ super(columns);
+ }
+
+ public OACPasswordField(String text, int columns) {
+ super(text, columns);
+ }
+
+ public OACPasswordField(Document doc, String txt, int columns) {
+ super(doc, txt, columns);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java
new file mode 100644
index 0000000..62ed59f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java
@@ -0,0 +1,50 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACPopupMenu extends JPopupMenu implements OACComponent {
+ public OACPopupMenu() {
+ super();
+ }
+
+ public OACPopupMenu(String label) {
+ super(label);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java
new file mode 100644
index 0000000..3b61948
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java
@@ -0,0 +1,62 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACProgressBar extends JProgressBar implements OACComponent {
+ public OACProgressBar() {
+ super();
+ }
+
+ public OACProgressBar(int orient) {
+ super(orient);
+ }
+
+ public OACProgressBar(int min, int max) {
+ super(min, max);
+ }
+
+ public OACProgressBar(int orient, int min, int max) {
+ super(orient, min, max);
+ }
+
+ public OACProgressBar(BoundedRangeModel newModel) {
+ super(newModel);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java
new file mode 100644
index 0000000..e341f3f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java
@@ -0,0 +1,74 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACRadioButton extends JRadioButton implements OACComponent {
+ public OACRadioButton() {
+ super();
+ }
+
+ public OACRadioButton(Icon icon) {
+ super(icon);
+ }
+
+ public OACRadioButton(Action a) {
+ super(a);
+ }
+
+ public OACRadioButton(Icon icon, boolean selected) {
+ super(icon, selected);
+ }
+
+ public OACRadioButton(String text) {
+ super(text);
+ }
+
+ public OACRadioButton(String text, boolean selected) {
+ super(text, selected);
+ }
+
+ public OACRadioButton(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACRadioButton(String text, Icon icon, boolean selected) {
+ super(text, icon, selected);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java
new file mode 100644
index 0000000..6a5f42c
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java
@@ -0,0 +1,74 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACRadioButtonMenuItem extends JRadioButtonMenuItem implements OACComponent {
+ public OACRadioButtonMenuItem() {
+ super();
+ }
+
+ public OACRadioButtonMenuItem(Icon icon) {
+ super(icon);
+ }
+
+ public OACRadioButtonMenuItem(String text) {
+ super(text);
+ }
+
+ public OACRadioButtonMenuItem(Action a) {
+ super(a);
+ }
+
+ public OACRadioButtonMenuItem(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACRadioButtonMenuItem(String text, boolean selected) {
+ super(text, selected);
+ }
+
+ public OACRadioButtonMenuItem(Icon icon, boolean selected) {
+ super(icon, selected);
+ }
+
+ public OACRadioButtonMenuItem(String text, Icon icon, boolean selected) {
+ super(text, icon, selected);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java
new file mode 100644
index 0000000..2683294
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java
@@ -0,0 +1,129 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACRootPane extends JRootPane implements OACComponent {
+ public OACRootPane() {
+ super();
+ }
+
+ @Override
+ protected OACLayeredPane createLayeredPane() {
+ OACLayeredPane p = new OACLayeredPane();
+ p.setName(this.getName()+".layeredPane");
+ return p;
+ }
+
+ @Override
+ protected Container createContentPane() {
+ JComponent c = new OACPanel();
+ c.setName(this.getName()+".contentPane");
+ c.setLayout(new BorderLayout() {
+ /* This BorderLayout subclass maps a null constraint to CENTER.
+ * Although the reference BorderLayout also does this, some VMs
+ * throw an IllegalArgumentException.
+ */
+ public void addLayoutComponent(Component comp, Object constraints) {
+ if (constraints == null) {
+ constraints = BorderLayout.CENTER;
+ }
+ super.addLayoutComponent(comp, constraints);
+ }
+ });
+ return c;
+ }
+
+// public void setOACMenuBar(OACMenuBar menu) {
+// super.setJMenuBar(menu);
+// }
+
+ @Deprecated
+ @Override
+ public JMenuBar getJMenuBar() {
+ if(this.menuBar instanceof OACMenuBar oacMenuBar)
+ return oacMenuBar;
+ else
+ return this.menuBar;
+ }
+
+ public OACMenuBar getOACMenuBar() {
+ return (OACMenuBar) this.menuBar;
+ }
+
+ @Deprecated
+ @Override
+ public void setLayeredPane(JLayeredPane layered) {
+ if(layered instanceof OACLayeredPane)
+ super.setLayeredPane(layered);
+ }
+
+ public void setLayeredPane(OACLayeredPane layeredPane) {
+ super.setLayeredPane(layeredPane);
+ }
+
+ @Deprecated
+ @Override
+ public void setDefaultButton(JButton defaultButton) {
+ if(defaultButton instanceof OACButton)
+ super.setDefaultButton(defaultButton);
+ }
+
+ public void setDefaultButton(OACButton defaultButton) {
+ super.setDefaultButton(defaultButton);
+ }
+
+ @Override
+ public OACButton getDefaultButton() {
+ return (OACButton) this.defaultButton;
+ }
+
+
+ @Override
+ public OACLayeredPane getLayeredPane() { return (OACLayeredPane) this.layeredPane; }
+
+ @Override
+ protected Component createGlassPane() {
+ OACPanel c = new OACPanel();
+ c.setName(this.getName()+".glassPane");
+ c.setVisible(false);
+ c.setOpaque(false);
+ return c;
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java
new file mode 100644
index 0000000..0e651cb
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java
@@ -0,0 +1,54 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACScrollBar extends JScrollBar implements OACComponent {
+ public OACScrollBar(int orientation, int value, int extent, int min, int max) {
+ super(orientation, value, extent, min, max);
+ }
+
+ public OACScrollBar(int orientation) {
+ super(orientation);
+ }
+
+ public OACScrollBar() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java
new file mode 100644
index 0000000..a3a50a9
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java
@@ -0,0 +1,58 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACScrollPane extends JScrollPane implements OACComponent {
+ public OACScrollPane(Component view, int vsbPolicy, int hsbPolicy) {
+ super(view, vsbPolicy, hsbPolicy);
+ }
+
+ public OACScrollPane(Component view) {
+ super(view);
+ }
+
+ public OACScrollPane(int vsbPolicy, int hsbPolicy) {
+ super(vsbPolicy, hsbPolicy);
+ }
+
+ public OACScrollPane() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java
new file mode 100644
index 0000000..2a36d72
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java
@@ -0,0 +1,50 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACSeparator extends JSeparator implements OACComponent {
+ public OACSeparator() {
+ super();
+ }
+
+ public OACSeparator(int orientation) {
+ super(orientation);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java
new file mode 100644
index 0000000..7b8a47f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java
@@ -0,0 +1,66 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACSlider extends JSlider implements OACComponent {
+ public OACSlider() {
+ super();
+ }
+
+ public OACSlider(int orientation) {
+ super(orientation);
+ }
+
+ public OACSlider(int min, int max) {
+ super(min, max);
+ }
+
+ public OACSlider(int min, int max, int value) {
+ super(min, max, value);
+ }
+
+ public OACSlider(int orientation, int min, int max, int value) {
+ super(orientation, min, max, value);
+ }
+
+ public OACSlider(BoundedRangeModel brm) {
+ super(brm);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java
new file mode 100644
index 0000000..430f31e
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java
@@ -0,0 +1,50 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACSpinner extends JSpinner implements OACComponent {
+ public OACSpinner(SpinnerModel model) {
+ super(model);
+ }
+
+ public OACSpinner() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java
new file mode 100644
index 0000000..e202a01
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java
@@ -0,0 +1,62 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACSplitPane extends JSplitPane implements OACComponent {
+ public OACSplitPane() {
+ super();
+ }
+
+ public OACSplitPane(int newOrientation) {
+ super(newOrientation);
+ }
+
+ public OACSplitPane(int newOrientation, boolean newContinuousLayout) {
+ super(newOrientation, newContinuousLayout);
+ }
+
+ public OACSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent) {
+ super(newOrientation, newLeftComponent, newRightComponent);
+ }
+
+ public OACSplitPane(int newOrientation, boolean newContinuousLayout, Component newLeftComponent, Component newRightComponent) {
+ super(newOrientation, newContinuousLayout, newLeftComponent, newRightComponent);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java
new file mode 100644
index 0000000..89819c0
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java
@@ -0,0 +1,54 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACTabbedPane extends JTabbedPane implements OACComponent {
+ public OACTabbedPane() {
+ super();
+ }
+
+ public OACTabbedPane(int tabPlacement) {
+ super(tabPlacement);
+ }
+
+ public OACTabbedPane(int tabPlacement, int tabLayoutPolicy) {
+ super(tabPlacement, tabLayoutPolicy);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java
new file mode 100644
index 0000000..9c3a515
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java
@@ -0,0 +1,73 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.util.Vector;
+
+public class OACTable extends JTable implements OACComponent {
+ public OACTable() {
+ super();
+ }
+
+ public OACTable(TableModel dm) {
+ super(dm);
+ }
+
+ public OACTable(TableModel dm, TableColumnModel cm) {
+ super(dm, cm);
+ }
+
+ public OACTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
+ super(dm, cm, sm);
+ }
+
+ public OACTable(int numRows, int numColumns) {
+ super(numRows, numColumns);
+ }
+
+ public OACTable(Vector extends Vector> rowData, Vector> columnNames) {
+ super(rowData, columnNames);
+ }
+
+ public OACTable(@NotNull Object[][] rowData, @NotNull Object[] columnNames) {
+ super(rowData, columnNames);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java
new file mode 100644
index 0000000..44918c2
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java
@@ -0,0 +1,67 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.text.Document;
+import java.awt.*;
+
+public class OACTextArea extends JTextArea implements OACComponent {
+ public OACTextArea() {
+ super();
+ }
+
+ public OACTextArea(String text) {
+ super(text);
+ }
+
+ public OACTextArea(int rows, int columns) {
+ super(rows, columns);
+ }
+
+ public OACTextArea(String text, int rows, int columns) {
+ super(text, rows, columns);
+ }
+
+ public OACTextArea(Document doc) {
+ super(doc);
+ }
+
+ public OACTextArea(Document doc, String text, int rows, int columns) {
+ super(doc, text, rows, columns);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java
new file mode 100644
index 0000000..dedd5fb
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java
@@ -0,0 +1,63 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.text.Document;
+import java.awt.*;
+
+public class OACTextField extends JTextField implements OACComponent {
+ public OACTextField() {
+ super();
+ }
+
+ public OACTextField(String text) {
+ super(text);
+ }
+
+ public OACTextField(int columns) {
+ super(columns);
+ }
+
+ public OACTextField(String text, int columns) {
+ super(text, columns);
+ }
+
+ public OACTextField(Document doc, String text, int columns) {
+ super(doc, text, columns);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java
new file mode 100644
index 0000000..e0d154b
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java
@@ -0,0 +1,50 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.text.StyledDocument;
+import java.awt.*;
+
+public class OACTextPane extends JTextPane implements OACComponent {
+ public OACTextPane() {
+ }
+
+ public OACTextPane(StyledDocument doc) {
+ super(doc);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTitledComponent.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTitledComponent.java
new file mode 100644
index 0000000..2d7f992
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTitledComponent.java
@@ -0,0 +1,34 @@
+/* Author: Maple
+ * Jan. 22 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACTitledComponent extends OACPanel {
+ @Getter @Setter
+ private OACLabel title;
+
+ @Getter @Setter
+ private C component;
+
+ public OACTitledComponent(String title, C component, int alignment) {
+ this.setLayout(new BorderLayout());
+
+ this.title = new OACLabel(title, alignment);
+
+ this.component = component;
+
+ this.add(this.title, BorderLayout.NORTH);
+ this.add(this.component);
+ }
+
+ public OACTitledComponent(String title, C component) {
+ this(title, component, SwingConstants.CENTER);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java
new file mode 100644
index 0000000..9a00c4f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java
@@ -0,0 +1,74 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACToggleButton extends JToggleButton implements OACComponent {
+ public OACToggleButton() {
+ super();
+ }
+
+ public OACToggleButton(Icon icon) {
+ super(icon);
+ }
+
+ public OACToggleButton(Icon icon, boolean selected) {
+ super(icon, selected);
+ }
+
+ public OACToggleButton(String text) {
+ super(text);
+ }
+
+ public OACToggleButton(String text, boolean selected) {
+ super(text, selected);
+ }
+
+ public OACToggleButton(Action a) {
+ super(a);
+ }
+
+ public OACToggleButton(String text, Icon icon) {
+ super(text, icon);
+ }
+
+ public OACToggleButton(String text, Icon icon, boolean selected) {
+ super(text, icon, selected);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java
new file mode 100644
index 0000000..8721c46
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java
@@ -0,0 +1,58 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACToolBar extends JToolBar implements OACComponent {
+ public OACToolBar() {
+ super();
+ }
+
+ public OACToolBar(int orientation) {
+ super(orientation);
+ }
+
+ public OACToolBar(String name) {
+ super(name);
+ }
+
+ public OACToolBar(String name, int orientation) {
+ super(name, orientation);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java
new file mode 100644
index 0000000..d1c38ff
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java
@@ -0,0 +1,45 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACToolTip extends JToolTip implements OACComponent {
+ public OACToolTip() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java
new file mode 100644
index 0000000..1479d10
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java
@@ -0,0 +1,74 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreeNode;
+import java.awt.*;
+import java.util.Hashtable;
+import java.util.Vector;
+
+public class OACTree extends JTree implements OACComponent {
+ public OACTree() {
+ super();
+ }
+
+ public OACTree(Object[] value) {
+ super(value);
+ }
+
+ public OACTree(Vector> value) {
+ super(value);
+ }
+
+ public OACTree(Hashtable, ?> value) {
+ super(value);
+ }
+
+ public OACTree(TreeNode root) {
+ super(root);
+ }
+
+ public OACTree(TreeNode root, boolean asksAllowsChildren) {
+ super(root, asksAllowsChildren);
+ }
+
+ public OACTree(TreeModel newModel) {
+ super(newModel);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java
new file mode 100644
index 0000000..2b93a84
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java
@@ -0,0 +1,45 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACViewport extends JViewport implements OACComponent {
+ public OACViewport() {
+ super();
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java
new file mode 100644
index 0000000..e6dd74f
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java
@@ -0,0 +1,62 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class OACWindow extends JWindow implements OACComponent {
+ public OACWindow() {
+ super();
+ }
+
+ public OACWindow(GraphicsConfiguration gc) {
+ super(gc);
+ }
+
+ public OACWindow(Frame owner) {
+ super(owner);
+ }
+
+ public OACWindow(Window owner) {
+ super(owner);
+ }
+
+ public OACWindow(Window owner, GraphicsConfiguration gc) {
+ super(owner, gc);
+ }
+
+ @Override
+ public Component add(Component comp) {
+ this.initOther(comp);
+ return super.add(comp);
+ }
+
+ @Override
+ public Component add(Component comp, int index) {
+ this.initOther(comp);
+ return super.add(comp, index);
+ }
+
+ @Override
+ public void add(@NotNull Component comp, Object constraints) {
+ this.initOther(comp);
+ super.add(comp, constraints);
+ }
+
+ @Override
+ public Component add(String name, Component comp) {
+ this.initOther(comp);
+ return super.add(name, comp);
+ }
+
+ @Override
+ public void add(Component comp, Object constraints, int index) {
+ this.initOther(comp);
+ super.add(comp, constraints, index);
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java
new file mode 100644
index 0000000..55b548e
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java
@@ -0,0 +1,52 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component.design;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+public final class Design {
+ public static final Design LIGHT = new Design("light", new HashMap<>());
+
+ public static final Design DARK = new Design("dark", new HashMap<>());
+
+ public static final Design CONTRAST = new Design("contrast", new HashMap<>());
+
+ @Getter
+ private final String name;
+
+ @Getter
+ private final Map, OACColor> elements;
+
+ public Design(String name, Map, OACColor> elements) {
+ this.name = name;
+ this.elements = elements;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (obj == null || obj.getClass() != this.getClass()) return false;
+ var that = (Design) obj;
+ return Objects.equals(this.name, that.name) &&
+ Objects.equals(this.elements, that.elements);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, elements);
+ }
+
+ @Override
+ public String toString() {
+ return "Design[" +
+ "name=" + name + ", " +
+ "elements=" + elements + ']';
+ }
+
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java
new file mode 100644
index 0000000..187b361
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java
@@ -0,0 +1,80 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component.design;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.openautonomousconnection.oacswing.component.OACAnimatedPanel;
+import org.openautonomousconnection.oacswing.component.OACButton;
+import org.openautonomousconnection.oacswing.component.OACComponent;
+import org.openautonomousconnection.oacswing.component.OACFrame;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public class DesignManager {
+ @Getter @Setter
+ private static Design globalDesign;
+
+ public static DesignManager getInstance() {
+ return Objects.requireNonNullElseGet(instance, DesignManager::new);
+ }
+
+ private static DesignManager instance;
+
+ private DesignManager() {
+ instance = this;
+ }
+
+ @Getter
+ private List designs;
+
+ public static void apply(OACComponent component) {
+ OACColor color;
+
+ if(globalDesign != null && ((color = globalDesign.getElements().get(component.getClass())) != null))
+ component.setBackground(color.getColor());
+ }
+
+ public static void apply(OACFrame frame) {
+ OACColor color;
+
+ if(globalDesign != null && ((color = globalDesign.getElements().get(frame.getClass())) != null))
+ frame.getContentPane().setBackground(color.getColor());
+
+
+ }
+
+ public void registerDesign(Design design) {
+ this.designs.add(design);
+ }
+
+ public void registerComponent(Class> componentClass, OACColor color) {
+ Style.Design eDesign = Style.Design.DARK;
+
+ if(componentClass.isAnnotationPresent(Style.class))
+ eDesign = componentClass.getAnnotation(Style.class).design();
+
+ Design design = switch (eDesign) {
+ case LIGHT -> Design.LIGHT;
+ case DARK -> Design.DARK;
+ case CONTRAST -> Design.CONTRAST;
+ };
+
+ design.getElements().putIfAbsent(componentClass, null);
+
+ design.getElements().replace(componentClass, color);
+ }
+
+ static {
+ Design.DARK.getElements().putAll(Map.of(
+ OACButton.class, OACColor.DARK_GREY,
+ OACAnimatedPanel.class, OACColor.LIGHT_GREY,
+ OACFrame.class, OACColor.GREY
+
+ ));
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java
new file mode 100644
index 0000000..eae3061
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java
@@ -0,0 +1,47 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component.design;
+
+import lombok.Getter;
+
+import java.awt.*;
+
+public enum OACColor {
+ WEAK_RED(Color.getHSBColor(355, 0.5f, 0.7f)),
+ STRONG_RED(Color.getHSBColor(350, 0.7f, 0.6f)),
+
+ WEAK_ORANGE(Color.getHSBColor(37, 0.6f, 0.8f)),
+ STRONG_ORANGE(Color.getHSBColor(30, 0.9f, 0.8f)),
+
+ WEAK_YELLOW(Color.getHSBColor(56, 0.45f, 0.80f)),
+ STRONG_YELLOW(Color.getHSBColor(45, 0.65f, 0.85f)),
+
+ WEAK_GREEN(Color.getHSBColor(125,0.35f,0.5f)),
+ STRONG_GREEN(Color.getHSBColor(110, 0.5f, 0.55f)),
+
+ WEAK_AQUA(Color.getHSBColor(175, 0.35f, 0.75f)),
+ STRONG_AQUA(Color.getHSBColor(195, 0.62f, 0.65f)),
+
+ WEAK_BLUE(Color.getHSBColor(225, 0.45f, 0.6f)),
+ STRONG_BLUE(Color.getHSBColor(215, 0.7f, 0.55f)),
+
+ WEAK_MAGENTA(Color.getHSBColor(277,0.35f,0.65f)),
+ STRONG_MAGENTA(Color.getHSBColor(266, 0.45f, 0.66f)),
+
+ DARK_GREY(Color.getHSBColor(0,0,0.25f)),
+
+ GREY(Color.getHSBColor(0, 0f, 0.44f)),
+
+ LIGHT_GREY(Color.getHSBColor(0, 0f, 0.60f)),
+
+ VERY_LIGHT_GREY(Color.getHSBColor(0, 0, 0.9f));
+
+ @Getter
+ private final Color color;
+
+ OACColor(Color color) {
+ this.color = color;
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/Style.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/Style.java
new file mode 100644
index 0000000..acba3b3
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/Style.java
@@ -0,0 +1,22 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.component.design;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Style {
+ enum Design {
+ LIGHT,
+ DARK,
+ CONTRAST
+ }
+
+ Design design();
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/icons/IconSize.java b/src/main/java/org/openautonomousconnection/oacswing/icons/IconSize.java
new file mode 100644
index 0000000..6fc7c5c
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/icons/IconSize.java
@@ -0,0 +1,30 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.icons;
+
+import lombok.Getter;
+
+/**
+ * Preset icon scales
+ */
+public enum IconSize {
+ SUPER_TINY(8),
+ TINY(16),
+ SMALLER(32),
+ SMALL(64),
+ LESS_MEDIUM(128),
+ MEDIUM(256),
+ MORE_MEDIUM(512),
+ LARGE(1024),
+ LARGER(2048),
+ HUGE(4096),
+ SUPER_HUGE(8192);
+
+ @Getter
+ private final int scale;
+ IconSize(int scale) {
+ this.scale = scale;
+ }
+}
diff --git a/src/main/java/org/openautonomousconnection/oacswing/icons/temp/TempIcons.java b/src/main/java/org/openautonomousconnection/oacswing/icons/temp/TempIcons.java
new file mode 100644
index 0000000..c1b91c7
--- /dev/null
+++ b/src/main/java/org/openautonomousconnection/oacswing/icons/temp/TempIcons.java
@@ -0,0 +1,22 @@
+/* Author: Maple
+ * Feb. 2 2026
+ * */
+
+package org.openautonomousconnection.oacswing.icons.temp;
+
+import org.openautonomousconnection.oacswing.ModifiableImageIcon;
+
+import javax.swing.*;
+
+/**
+ * Class containing testing / placeholder icons
+ */
+public class TempIcons {
+ public static final ModifiableImageIcon TEMP_HOLE_ICON;
+
+ static {
+ ClassLoader classloader = Thread.currentThread().getContextClassLoader();
+
+ TEMP_HOLE_ICON = new ModifiableImageIcon(classloader.getResource("defaults/icons/temp_hole.png"));
+ }
+}
diff --git a/src/main/resources/defaults/icons/temp_hole.png b/src/main/resources/defaults/icons/temp_hole.png
new file mode 100644
index 0000000..472f247
Binary files /dev/null and b/src/main/resources/defaults/icons/temp_hole.png differ
diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java b/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java
index 55f6162..9e7ec15 100644
--- a/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java
+++ b/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java
@@ -15,9 +15,10 @@ public class AnimationTests {
AnimationPath animationPath = new AnimationPath(50);
- animationPath.add(new KeyFrame(new Point(0, 0), 400, 400));
- animationPath.add(new KeyFrame(new Point(0, 0), 800, 600));
- animationPath.add(new KeyFrame(new Point(0, 0), 400, 400));
+ animationPath.add(new KeyFrame(new Point(400, 400), 400, 400));
+ animationPath.add(new KeyFrame(new Point(400, 300), 400, 400));
+ animationPath.add(new KeyFrame(new Point(100, 100), 400, 400));
+ animationPath.add(new KeyFrame(new Point(400, 400), 400, 400));
JAnimatedPanel animatedPanel = new JAnimatedPanel(animationPath);
@@ -25,10 +26,10 @@ public class AnimationTests {
frame.add(animatedPanel);
- animatedPanel.play(0.1);
+ animatedPanel.play(0.1, true);
frame.setVisible(true);
- wait(5000);
+ wait(15000);
}
}
diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java b/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java
new file mode 100644
index 0000000..a2f7a31
--- /dev/null
+++ b/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java
@@ -0,0 +1,34 @@
+package org.openautonomousconnection.oacswing.test;
+
+import org.junit.jupiter.api.Test;
+import org.openautonomousconnection.oacswing.component.OACTitledComponent;
+import org.openautonomousconnection.oacswing.component.*;
+import org.openautonomousconnection.oacswing.component.design.Design;
+import org.openautonomousconnection.oacswing.component.design.DesignManager;
+import org.openautonomousconnection.oacswing.icons.IconSize;
+import org.openautonomousconnection.oacswing.icons.temp.TempIcons;
+
+import java.awt.*;
+
+public class CustomizedTests {
+ @Test
+ public synchronized void testCustomElements() throws InterruptedException {
+ DesignManager designManager = DesignManager.getInstance();
+
+ DesignManager.setGlobalDesign(Design.DARK);
+
+ OACFrame frame = TestUtils.mockOacFrame();
+
+ frame.setLayout(new FlowLayout(FlowLayout.CENTER));
+
+ frame.add(new OACButton());
+
+ OACLabel imageLabel = new OACLabel(TempIcons.TEMP_HOLE_ICON.ofSize(IconSize.MEDIUM));
+
+ frame.add(new OACTitledComponent<>("Titled", imageLabel));
+
+ frame.setVisible(true);
+
+ wait(5000);
+ }
+}
diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java b/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java
index 05c2d99..79ebd5f 100644
--- a/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java
+++ b/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java
@@ -1,5 +1,7 @@
package org.openautonomousconnection.oacswing.test;
+import org.openautonomousconnection.oacswing.component.OACFrame;
+
import javax.swing.*;
import java.awt.*;
@@ -13,4 +15,14 @@ public class TestUtils {
return frame;
}
+
+ public static OACFrame mockOacFrame() {
+ OACFrame frame = new OACFrame();
+
+ frame.setBounds(new Rectangle(800, 600));
+
+ frame.setLocationRelativeTo(null);
+
+ return frame;
+ }
}