Na panelu głównym umieszczam panel z wykresem.
Chodzi o zaznaczenia jego kawałka tak aby możliwe było rozszerzanie zaznaczenia.

Napisałem coś takiego, ale to nie działa jak powinno, bo nie daje się rozszerzać z obydwu stron, i po dodaniu wykresu jedno zaznaczenie nie usuwa drugiego.
Zmienne x0,x1,x2,xn oznaczają pozycję xową, a xd różnicę.
Mam zdefiniowane następujące akcje:

poniższa funkcja zaznacza pojedynczy piksel
public static void mouseclicked(java.awt.event.MouseEvent evt, Color color){
x0=evt.getX();
JPanel plot=(JPanel)(evt.getSource());
Graphics g=plot.getGraphics();
plot.update(g);
g.setColor(color);
g.drawLine(x0, 20, x0, plot.getHeight()-20);
}

Sprawdzam, czy jest już coś zaznaczone, i pobieram początek zaznaczenia
public static void mousepressed(java.awt.event.MouseEvent evt){
if (x0 == -1) {
if (x0 != evt.getX()) {
x0 = evt.getX();
x1 = x0;
}
} else{
x0 = evt.getX();
}
}

pobieram koniec zaznaczenia
public static void mousereleased(java.awt.event.MouseEvent evt){
if(xn!=evt.getX()){
xn=evt.getX();
// x2=xn;
}
}

zaznaczenia podczas przeciągania, tu gdzieś jest błąd
public static void mousedragged(java.awt.event.MouseEvent evt, Color color){
JPanel plot = (JPanel) (evt.getComponent());
Graphics g = plot.getGraphics();
int xd;
int tmpx = evt.getX();
// <editor-fold defaultstate="collapsed" desc="if nothing selected">
if (x0 == -1 || xn == -1) { //gdy nie ma zaznaczenia
if (tmpx < x1) { //czy zaznaczam w lewo od początku
xd = x1 - tmpx;
x1 = tmpx;
g.setColor(color);
g.fillRect(x1, 0, xd, plot.getHeight() - 1);
x2=x0;
} else { //czy w prawo od początku
xd = tmpx - x1;
g.setColor(color);
g.fillRect(x1, 0, xd, plot.getHeight() - 1);
x1 = tmpx;
x2=tmpx;
}
// </editor-fold>
} else { //gdy zaznaczenie już jest
if (x1>x0-4 && x1<x0+4) { //pozwala na zmianę rozmiaru zaznaczenia
if (tmpx > x0) {
xd=tmpx-x2;
g.setColor(plot.getBackground());
g.fillRect(x2, 0, xd, plot.getHeight()-1);
x2=tmpx;
} else {
xd = x2 - tmpx;
x2 = tmpx;
g.setColor(color);
g.fillRect(x2, 0, xd, plot.getHeight() - 1);
}
// <editor-fold defaultstate="collapsed" desc="if new selection">
} else {
plot.update(g);
x0 = tmpx;
x1 = tmpx;
xn = -1;
mousedragged(evt, color);
}
// </editor-fold>
}
}

Zmienia kursor w przedziale +-3 piksele od zaznaczenia
public static void mousemove(java.awt.event.MouseEvent evt, Cursor cursor){
JPanel plot = (JPanel) (evt.getComponent());
int x=evt.getX();
if((x>x2-4 && x<x2+4)||(x>x1-4 && x<x1+4)){//4 oznacza, że ma się po 3 piksele marginesu
plot.setCursor(cursor);
}else{
plot.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}

Panel z wykresem umieszczam tak:

plot.removeAll(); //plot to panel na którym umieszczam
plot.add(oscillogram); //oscylogram to panel który umieszczam
plot.setLayout(new javax.swing.OverlayLayout(plot));
plot.updateUI();